我在数据库中有一个具有:start_time
和:timezone
属性的记录foo
。
例如,:start_time
是UTC - 2001-01-01 14:20:00
中的时间。例如,:timezone
是一个字符串- America/New_York
。
我想创建一个新的Time对象,其值为:start_time
,但其时区由:timezone
指定。我不想加载:start_time
,然后将其转换为:timezone
,因为Rails会很聪明,它会更新UTC的时间,使其与那个时区保持一致。
目前,
t = foo.start_time
=> 2000-01-01 14:20:00 UTC
t.zone
=> "UTC"
t.in_time_zone("America/New_York")
=> Sat, 01 Jan 2000 09:20:00 EST -05:00
相反,我想看到
=> Sat, 01 Jan 2000 14:20:00 EST -05:00
即。我想做的是:
t
=> 2000-01-01 14:20:00 UTC
t.zone = "America/New_York"
=> "America/New_York"
t
=> 2000-01-01 14:20:00 EST
发布于 2013-05-30 00:14:38
听起来你想要的东西大概是
ActiveSupport::TimeZone.new('America/New_York').local_to_utc(t)
这表示将此本地时间(使用区域)转换为utc。如果您设置了Time.zone
,那么您当然可以
Time.zone.local_to_utc(t)
这不会使用附加到t的时区-它假设它是您转换的时区的本地时区。
这里需要注意的一个边缘情况是DST转换:您指定的本地时间可能不存在或可能不明确。
发布于 2017-09-29 00:20:50
发布于 2015-08-27 03:13:46
如果您正在使用Rails,下面是Eric Walsh回答的另一种方法:
def set_in_timezone(time, zone)
Time.use_zone(zone) { time.to_datetime.change(offset: Time.zone.now.strftime("%z")) }
end
https://stackoverflow.com/questions/16818180
复制相似问题