Для начала я использую старую версию rails из-за Redmine.
Я пытаюсь написать скрипт для обновления временных меток дампа базы данных Redmine 'до определенного часового пояса, поэтому мне нужен ruby для их анализа и изменения часового пояса, предполагая, что рельсы могут обрабатывать границы dst.
Тем не менее, я нашел несоответствие (или неправильно понял), как работает Time.parse.
Вот скрипт, который я выполнил в моем приложении Rails 2.3.5 raw:
impulse@ImpulseServer:~/pgtz_converter$ script/console
Loading development environment (Rails 2.3.5)
>> Time.zone
=> #<ActiveSupport::TimeZone:0x7fa94a57b9a8 @tzinfo=nil, @name="UTC", @utc_offset=0>
>> Time.parse('2011-02-19 23:00:00')
=> Sat Feb 19 23:00:00 -0200 2011
>> Time.zone
=> #<ActiveSupport::TimeZone:0x7fa94a57b9a8 @tzinfo=nil, @name="UTC", @utc_offset=0>
>> Time.parse('2011-02-20 00:00:00')
=> Sun Feb 20 00:00:00 -0300 2011
>> Time.zone
=> #<ActiveSupport::TimeZone:0x7fa94a57b9a8 @tzinfo=nil, @name="UTC", @utc_offset=0>
>> Time.parse('2011-02-19 23:00:00')
=> Sat Feb 19 23:00:00 -0300 2011
>> Time.zone
=> #<ActiveSupport::TimeZone:0x7fa94a57b9a8 @tzinfo=nil, @name="UTC", @utc_offset=0>
>> exit
Вот что происходит выше:
Локальная дата-зона сервера - BRT.
impulse@ImpulseServer:~/pgtz_converter$ date
Fri Apr 8 19:17:34 BRT 2011
Сначала я проверяю Time.zone (который является UTC), затем пытаюсь проанализировать дату DST.
Вывод в порядке, DST включен (я предполагаю, что Time.zone = UTC означает, что Ruby проверил конфигурацию зоны сервера и использовал ее).
Затем я пробую другую дату, когда DST больше не был активен (DST закончился 20.02.2011 00:00 здесь).
Эта дата правильно проанализирована (GMT-3).
Теперь проблема начинается.
Я пытаюсь снова проанализировать старую дату летнего времени, и результат неправильный! Это не было прочитано как дата летнего времени!
Я подумал, что, возможно, синтаксический анализ изменил Time.zone, но по мере вставки он все время находится в UTC.
Что вызывает это?
Спасибо за чтение.
Нило