【问题标题】:Convert UTC to local time in Rails 3在 Rails 3 中将 UTC 转换为本地时间
【发布时间】:2011-07-15 02:28:42
【问题描述】:

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

moment 是一些Time UTC 变量(例如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) 一年的地方使用。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 timezone activesupport


    【解决方案1】:

    如果您实际上只是因为想要获取用户的时区而这样做,那么您所要做的就是更改您的时区config/applications.rb

    像这样:

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

    config.time_zone = "Singapore"
    

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

    【讨论】:

      【解决方案2】:

      我相信,basecamp 实际上有一个名为 local_time 的不错的 Gem 仅在客户端完成所有这些操作:

      https://github.com/basecamp/local_time

      【讨论】:

      • 这样效果最好。我们知道已经存储的时间,在我看来,以格式向用户显示它的方式最好在客户端完成,并且这样做。
      【解决方案3】:

      使用系统本地区域很容易配置它, 只需在您的 application.rb 中添加此

      config.time_zone = Time.now.zone
      

      然后,rails 应该显示你本地时间的时间戳,或者你可以使用类似这个指令来获取本地时间

      Post.created_at.localtime
      

      【讨论】:

        【解决方案4】:

        不知道为什么,但就我而言,它不像之前建议的那样工作。 但它的工作原理是这样的:

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

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

        【讨论】:

          【解决方案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)")
          

          【讨论】:

          • 如何自动使用时区供用户访问网络应用程序?
          • 我发现的唯一方法是使用 Javascript,然后将其传递回服务器。 (new Date()).getTimeZoneOffset()。但它相当不一致,所以这家伙似乎写了自己的:onlineaspect.com/2007/06/08/…
          • 自动将时区添加到所有 ActiveRecord 日期时间 -- config.time_zone = 'Eastern Time (US & Canada)' -- 在 config/application.rb 中
          • 更新:链接 JS 解决方案的所有者指向更新的解决方案:pellepim.bitbucket.org/jstz
          • @dmonopoly 您可以在应用程序配置config.time_zone = 'Wellington' 中设置时区,然后使用 Time.current(相当于 time.now 但使用您设置的时区)
          【解决方案6】:

          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 
          

          【讨论】:

          • 这是一个开始。如何设置当前时区(因为我什至不确定应用程序将托管在哪里,所以服务器可能与应该使用的时区不同)。
          • “localtime”方法很酷,但是运行代码的机器的时区不如用户访问网络应用程序的时区有用。 (此处提到:stackoverflow.com/questions/6003491/rails-3-user-timezones/…)如何获取用户访问网络应用程序的时区?
          • @daze 我想您可以为您的用户设置一个选项来选择他们的时区,然后将in_time_zone 方法与他们的时区一起使用。
          • 谢谢,localtime 方法正是我所需要的。
          • Time.now.localtime 在正常的 irb 会话上工作,但是当我尝试在 UTC 时区的机器上运行它时,它不起作用。
          猜你喜欢
          • 2012-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-27
          • 2020-01-11
          • 2011-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多