Ruby / Rails 怎么更改时间的时区,而不更改值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我有foo数据库中有记录:start_time:timezone属性。

: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
提问于
用户回答回答于

ActiveSupport::TimeZone.new('America/New_York').local_to_utc(t)

这表示将此本地时间(使用区域)转换为utc。如果Time.zone已经确定了,那么可以

Time.zone.local_to_utc(t)
用户回答回答于

如果你使用的是Rails,这里是另一种方法:

def set_in_timezone(time, zone)
  Time.use_zone(zone) { time.to_datetime.change(offset: Time.zone.now.strftime("%z")) }
end

扫码关注云+社区