我的应用程序在“莫斯科”(+04:00)时区工作。但有时我只需要按本地时间(例如“2012 年 5 月 1 日 13:45”)和 ActiveSupport::TimeZone 对象的名称(例如“柏林”:夏令时 +02:00 和 +01: 00 否则)。
例如,如果我得到“2012 年 5 月 1 日 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:我认为 DST 更改时间时可能会出现错误。例如,2011 年 3 月 26 日是柏林时区的 GMT+1 并Time.now.in_time_zone("Berlin").formatted_offset
返回“GMT+1”,但 2011 年 3 月 27 日将是 GMT+2。因此,如果我在 3 月from_local_datetime("28 march 2011", "Berlin")
27 日之前调用它会返回28 march 2011 00:00:00 +0100
,但如果我在更改后调用它我的函数返回的时间28 march 2011 00:00:00 +0200
:(