Разбор Rails Time.zone не работает должным образом

Я столкнулся с этой проблемой при тестировании приложения rails, развернутого на двух разных промежуточных серверах в разных часовых поясах (PDT и CDT). Оба сервера имеют рельсы, использующие UTC config.time_zone по умолчанию. Помимо того, что конфигурация часового пояса отличается, часы на обоих серверах установлены правильно.

Ниже то, что я вижу в консоли рельсов:

На сервере, где системный часовой пояс CDT,

Time.zone.parse("Mon May 28 2012 00:00:00 GMT-0700 (PDT)")
 => Mon, 28 May 2012 05:00:00 UTC +00:00 

На сервере, где системный часовой пояс PDT,

Time.zone.parse("Mon May 28 2012 00:00:00 GMT-0700 (PDT)")
 => Mon, 28 May 2012 07:00:00 UTC +00:00

Строка Mon May 28 2012 00:00:00 GMT-0700 (PDT) представляет собой произвольное значение даты и времени, отправленное клиентом. Это распространенный сценарий при использовании объекта Date javascript, поступающего через коллекцию параметров rails.

Почему два результата Time.zone.parse(identical_date_time_string) отличаются?

Если я запускаю следующее в обеих системах, результат будет правильным:

"Mon May 28 2012 00:00:00 GMT-0700 (PDT)".to_time
 => 2012-05-28 07:00:00 UTC

Я запускаю рельсы 3.2.3 с рубином 1.9.3-p125 на Ubuntu.


person Shyam Habarakada    schedule 07.04.2012    source источник
comment
Открыта проблема с рельсами github.com/rails/rails/issues/5770   -  person Shyam Habarakada    schedule 07.04.2012
comment
Удалось исправить ActiveSupport::TimeZone для обработки строк даты формата здесь. Вы можете найти патч здесь, в комментариях.   -  person Shyam Habarakada    schedule 07.04.2012
comment
Первоначальная проблема теперь исправлена ​​в рельсах с помощью этой фиксации github.com/rails/rails/commit/   -  person Shyam Habarakada    schedule 21.05.2013


Ответы (2)


ActiveSupportTimeZone.parse не пытается извлечь информацию о часовом поясе из данной строки. Он просто извлекает дату и время и преобразует их в TimeWithZone с заданным (местным) часовым поясом.

str.to_time заметит строку "GMT-0700", но выдаст время без часового пояса.

Вы можете подделать его, извлекая часть «GMT……» и преобразовывая ее в смещение UTC, которое близко, но не точно, к часовому поясу.

person Michael Slade    schedule 07.04.2012
comment
Привет, Майкл! Я добавил дополнительные сведения о том, как правильно анализируется одна и та же строка даты и времени при использовании метода .to_time для строки. Который работает последовательно и точно. - person Shyam Habarakada; 07.04.2012

Вот как я это делаю

> Time.zone = "Hawaii"
=> "Hawaii"
> Time.zone.parse("Tue Mar 13 2012 13:00:00 GMT+1300 (NZDT)".sub("GMT",""))
=> Mon, 12 Mar 2012 14:00:00 HST -10:00
> Time.zone = "UTC"
=> "UTC"
> Time.zone.parse("Tue Mar 13 2012 13:00:00 GMT+1300 (NZDT)".sub("GMT",""))
=> Tue, 13 Mar 2012 00:00:00 UTC 00:00
person JosephL    schedule 11.04.2013
comment
Джозеф, проблема теперь исправлена ​​в рельсах. См. github.com/rails/rails/commit/. - person Shyam Habarakada; 21.05.2013
comment
@ShyamHabarakada Спасибо за совет. Рад, что они наконец разобрались - person JosephL; 27.05.2013