Мое приложение работает в часовом поясе "Москва" (+04:00). Но иногда мне нужно создать объект времени только по местному времени (например, "01 мая 2012 13:45") и имени объекта ActiveSupport::TimeZone (например, "Берлин": +02:00 по летнему времени и +01: 00 иначе).
Например, если я получаю "01 мая 2012 13:45" и "Берлин" в качестве входных данных, я хочу получить "2012-05-01 13:45:00 +0200" или "2012-05-01 11:45:00 + 0000". Я создаю следующую функцию:
def from_local_datetime(local_datetime, time_zone)
offset = Time.now.in_time_zone(time_zone).formatted_offset
datetime = case local_datetime
when String
DateTime.parse(local_datetime)
else
DateTime.new(local_datetime)
end.change(:offset => offset)
return datetime
end
И на первый взгляд он работает так, как я ожидал. Но является ли это лучшей практикой для такого рода задач? Может быть в какой-то ситуации работает с ошибками. Я не уверен.
Буду рад любым комментариям.
UPD: я думаю, что может возникнуть ошибка, связанная со временем, когда летнее время меняется. Например, 26 марта 2011 г. было GMT+1 в часовом поясе Берлина, а Time.now.in_time_zone("Berlin").formatted_offset
возвращает "GMT+1", но 27 марта 2011 г. будет GMT+2. Поэтому, если я позвоню from_local_datetime("28 march 2011", "Berlin")
до 27 марта, он вернет 28 march 2011 00:00:00 +0100
, но если я позвоню после изменения времени моя функция возвращает 28 march 2011 00:00:00 +0200
:(
Time.now.in_time_zone(time_zone).formatted_offset
(+1, если Time.now равно27 march 2011
). Но мне нужен зачет в Берлине, когда будет28 march 2011
(зачет будет +2). - person petRUShka   schedule 05.05.2012