我无法在 Rails 3 中将 UTC Time
或 TimeWithZone
转换为本地时间。
假设 moment
是 UTC 中的某个 Time
变量(例如 moment = Time.now.utc
)。如何将 moment
转换为我的时区,注意 DST(即使用 EST/EDT)?
更准确地说,如果时间对应于美国东部时间今天早上 9 点,我想打印“3 月 14 日星期一,上午 9 点”,如果时间是美国东部时间上周一上午 9 点,我想打印“3 月 7 日星期一,上午 9 点”。
希望有其他方法吗?
编辑:I first thought“EDT”应该是一个公认的时区,但“EDT”不是一个实际的时区,更像是一个时区的状态。例如,要求 Time.utc(2011,1,1).in_time_zone("EDT")
没有任何意义。这有点令人困惑,因为“EST”是一个实际的时区,在一些不使用夏令时并且是 (UTC-5) 一年的地方使用。
Time#localtime
将为您提供运行代码的机器当前时区的时间:
> moment = Time.now.utc
=> 2011-03-14 15:15:58 UTC
> moment.localtime
=> 2011-03-14 08:15:58 -0700
更新:如果您想转换到特定时区而不是您自己的时区,那么您就在正确的轨道上。但是,不必担心 EST 与 EDT,只需传入一般的东部时区——它会根据日期知道是 EDT 还是 EST:
> Time.now.utc.in_time_zone("Eastern Time (US & Canada)")
=> Mon, 14 Mar 2011 11:21:05 EDT -04:00
> (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)")
=> Sat, 14 Jan 2012 10:21:18 EST -05:00
Rails 有自己的名字。看到他们:
rake time:zones:us
您还可以为所有时区运行 rake time:zones:all
。要查看更多与区域相关的 rake 任务:rake -D time
因此,要转换为 EST,自动适应 DST:
Time.now.in_time_zone("Eastern Time (US & Canada)")
(new Date()).getTimeZoneOffset()
。但它相当不一致,所以这个人似乎已经写了自己的:onlineaspect.com/2007/06/08/…
config.time_zone = 'Wellington'
中设置时区,然后使用 Time.current (相当于 time.now 但使用您设置的时区)
使用您的系统本地区域很容易配置它,只需在您的 application.rb 添加这个
config.time_zone = Time.now.zone
然后,rails 应该显示你本地时间的时间戳,或者你可以使用类似这个指令的东西来获取本地时间
Post.created_at.localtime
实际上,basecamp 有一个名为 local_time
的不错的 Gem 仅在客户端完成所有这些工作,我相信:
https://github.com/basecamp/local_time
不知道为什么,但就我而言,它不像之前建议的那样工作。但它是这样工作的:
Time.now.change(offset: "-3000")
当然,您需要将 offset
值更改为您的值。
如果您实际上只是因为想要获取用户的时区而这样做,那么您所要做的就是更改您的时区 config/applications.rb
。
像这样:
默认情况下,即使您指定了当前时区,Rails 也会以 UTC 格式保存您的时间记录。
config.time_zone = "Singapore"
所以这就是你所要做的,你很高兴。
in_time_zone
方法与他们的时区一起使用。Time.now.localtime
适用于正常的 irb 会话,但是当我尝试在 UTC 时区的机器上运行它时,它不起作用。