在Rails 3中将UTC转换为本地时间
我无法在Rails 3 TimeWithZone
UTC Time
或TimeWithZone
转换为本地时间。
说moment
是UTC中的某个Time
variables(例如, moment = Time.now.utc
)。 如何将moment
转换为我的时区,照顾DST(即使用EST / EDT)?
更准确地说,如果时间是上午9点,“上午9点”,如果时间是上星期一上午9点,我想打印出“3月14日星期一上午9点”。
希望有另一种方式?
编辑 : 我首先想到 “EDT”应该是一个公认的时区,但“EDT”不是一个实际的时区,更像是一个时区的状态。 例如,要求Time.utc(2011,1,1).in_time_zone("EDT")
没有任何意义。 这有点令人困惑,因为“EST” 是一个实际的时区,在less数几个不使用夏令时并且是(UTC-5)一年的地方使用。
Rails有自己的名字。 看到他们:
rake time:zones:us
您也可以运行rake time:zones:all
用于所有时区。 要查看更多区域相关的rake任务: rake -D time
所以,转换到EST,自动迎合DST:
Time.now.in_time_zone("Eastern Time (US & Canada)")
Time#localtime
将给你在运行代码的机器的当前时区的时间:
> moment = Time.now.utc => 2011-03-14 15:15:58 UTC > moment.localtime => 2011-03-14 08:15:58 -0700
更新:如果你想转换到特定的时区而不是你自己的时区,那么你就是在正确的轨道上。 但是,不要担心美国东部时间和美国东部时间,只需通过东部时区即可,根据美国东部时间是否是美国东部时间或美国东部时间:
> 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
实际上有一个很棒的gem,被basecamp称为local_time
,只能在客户端做所有的事情,我相信:
使用你的系统本地区域很容易configuration它,只需在你的application.rb中添加这个
config.time_zone = Time.now.zone
然后,rails应该在你的本地时间显示你的时间戳,或者你可以使用类似这样的指令获取本地时间
Post.created_at.localtime
不知道为什么,但在我的情况下,它不符合前面提出的方式。 但它的工作原理是这样的:
Time.now.change(offset: "-3000")
当然,你需要改变你的offset
值。