我的应用正在“莫斯科”(+04:00)时区工作。但有时我需要只在当地时间创建时间对象(例如“01 may 2012 13:45”)和ActiveSupport :: TimeZone对象的名称(例如“柏林”:夏令时+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
:(
答案 0 :(得分:0)
您的转换方法是正确的方法。
对于网站,您应确保将时间存储为数据库中的UTC。如果您可以从数据库中获取UTC值,而不是本地时间(或者您可以将Web服务器的时区设置为UTC),则无需将时间从UTC转换为本地时间然后将其转换为用户的时区。
当然,您必须存储用户的时区偏好。
答案 1 :(得分:0)
TZInfo::Timezone.get('Europe/London')
查找时区
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html