我的应用程序正在使用"莫斯科"(+04:00(时区。但有时我只需要按本地时间(例如"01 May 2012 13:45"(和 ActiveSupport::时区对象的名称(例如"柏林":夏令时 +02:00,否则为 +01:00(。
例如,如果我输入"01 May 2012 13:45"和"Berlin",我希望生成"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 月 27 日之前调用from_local_datetime("28 march 2011", "Berlin")
,它会返回 28 march 2011 00:00:00 +0100
,但是如果我在更改时间后调用它,我的函数返回28 march 2011 00:00:00 +0200
:(
您的转换方法是正确的方法。
对于网站,您应该确保时间在数据库中以 UTC 形式存储。 如果可以从数据库中获取 UTC 值,而不是本地时间(或者您可以将 Web 服务器的时区设置为 UTC(,则当您无论如何都要将其转换为用户的时区时,它就不必将时间从 UTC 转换为本地时间。
而且,当然,您必须存储用户的时区首选项。
TZInfo::Timezone.get('Europe/London')
查找时区
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html