关于ruby:在Rails 3中将UTC转换为本地时间

Convert UTC to local time in Rails 3

在Rails 3中,我无法将UTC TimeTimeWithZone转换为本地时间。

假设moment是UTC中的某个Time变量(如moment = Time.now.utc)。如何将moment转换为时区,并处理DST(即使用EST/EDT)?

更准确地说,我想打印"3月14日星期一上午9点",如果时间与美国东部夏令时上午9点相对应,则打印"3月14日星期一上午9点",如果时间是上星期一东部夏令时上午9点,则打印"3月7日星期一上午9点"。

希望还有别的办法?

编辑:我首先认为"edt"应该是可识别的时区,但"edt"不是实际的时区,更像是时区的状态。例如,要求Time.utc(2011,1,1).in_time_zone("EDT")是没有意义的。这有点令人困惑,因为"est"是一个实际时区,在一些不使用夏令时且长达(UTC-5)年的地方使用。


Time#localtime将为您提供运行代码的机器当前时区的时间:

1
2
3
4
> moment = Time.now.utc
  => 2011-03-14 15:15:58 UTC
> moment.localtime
  => 2011-03-14 08:15:58 -0700

更新:如果你想转换到特定的时区而不是你自己的时区,你就走对了。然而,与其担心东部时间与东部时间的对比,只需在东部一般时区通过——它将根据当天的情况知道是东部时间还是东部时间:

1
2
3
4
> 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有自己的名字。与他们见面:

1
rake time:zones:us

您还可以为所有时区运行rake time:zones:all。查看更多与区域相关的rake任务:rake -D time

因此,要转换为EST,自动满足DST:

1
Time.now.in_time_zone("Eastern Time (US & Canada)")


我相信,Basecamp实际上有一个很好的gem叫做local_time,它只在客户方完成所有这些工作:

https://github.com/basecamp/localu时间


使用系统本地区域很容易配置它,就在你的应用程序中。rb添加这个

1
config.time_zone = Time.now.zone

然后,Rails应该在您的本地时间中显示时间戳,或者您可以使用类似于此指令的东西来获取本地时间。

1
Post.created_at.localtime


如果你只是因为你想得到用户的时区,那么你所要做的就是改变你的时区。

这样地:

默认情况下,Rails将以UTC格式保存时间记录,即使您指定了当前时区。

1
config.time_zone ="Singapore"

所以这就是你所要做的,你很高兴去。


不知道为什么,但在我的例子中,它并不像以前提出的那样有效。但它是这样工作的:

1
Time.now.change(offset:"-3000")

当然,你需要将EDCOX1值4的值改为你的值。