首页 文章

在Rails 3中将UTC转换为本地时间

提问于
浏览
90

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

假设 moment 是UTC中的一些 Time 变量(例如 moment = Time.now.utc ) . 如何将 moment 转换为我的时区,照顾DST(即使用EST / EDT)?

更确切地说,如果时间对应于美国东部夏令时间上午9点和“3月7日上午9点”,如果时间是美国东部时间上周一上午9点,我打算打印出“3月14日星期一上午9点” .

希望还有另一种方式吗?

EditI first thought "EDT"应该是公认的时区,但"EDT"不是实际时区,更像是时区的状态 . 例如,要求 Time.utc(2011,1,1).in_time_zone("EDT") 没有任何意义 . 这有点令人困惑,因为"EST" is 是一个实际时区,在一些不使用夏令时的地方使用,并且是(UTC-5)一年 .

6 回答

  • 104

    可以使用系统本地区域轻松配置它,只需在您的application.rb中添加即可

    config.time_zone = Time.now.zone
    

    然后,rails应该在本地时间显示时间戳,或者您可以使用类似此指令的内容来获取本地时间

    Post.created_at.localtime
    
  • 107

    不知道为什么,但在我的情况下它不会像以前建议的那样工作 . 但它的工作方式如下:

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

    当然,您需要将 offset 值更改为您的值 .

  • 0

    如果你是're actually doing it just because you want to get the user'的时区,那么你所要做的就是改变你的时区 config/applications.rb .

    像这样:

    Rails, by default, will save your time record in UTC even if you specify the current timezone.

    config.time_zone = "Singapore"
    

    所以这就是你要做的一切,你很高兴 .

  • 15

    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
    
  • 0

    Rails有自己的名字 . 看到他们:

    rake time:zones:us
    

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

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

    Time.now.in_time_zone("Eastern Time (US & Canada)")
    
  • 10

    实际上有一个由basecamp称为 local_time 的漂亮宝石,只在客户端做所有这些,我相信:

    https://github.com/basecamp/local_time

相关问题