【问题标题】:How do I Convert DateTime.now to UTC in Ruby?如何在 Ruby 中将 DateTime.now 转换为 UTC?
【发布时间】:2009-04-16 11:15:12
【问题描述】:

如果我有d = DateTime.now,如何将“d”转换为 UTC(带有适当的日期)?

【问题讨论】:

    标签: ruby


    【解决方案1】:
    DateTime.now.new_offset(0)
    

    将在标准 Ruby 中工作(即没有 ActiveSupport)。

    【讨论】:

    • 而这其实是这个问题最正确的答案。
    • 这应该有更多的赞成票。日期时间与时间不同。我正是需要这个。
    • new_offset 方法参数已经默认为 0。所以DateTime.now.new_offset也可以使用。
    【解决方案2】:

    d = DateTime.now.utc

    哎呀!

    这似乎在 Rails 中有效,但在普通 Ruby 中无效(当然这就是问题所在)

    d = Time.now.utc
    

    但确实有效。

    您是否有任何理由需要使用DateTime 而不是TimeTime 应该包括你需要的一切:

    irb(main):016:0> Time.now
    => Thu Apr 16 12:40:44 +0100 2009
    

    【讨论】:

    • 因为我想要正确的转换日期,即 GMT +10 可以提前第二天...
    • 时间会为你做好的。时间也包括日期部分,而不仅仅是一天中的时间。做 Time.now.inspect 看看。
    • 天哪。那么 Date、Time 和 DateTime 之间有什么区别呢?
    • 时间在内部存储为自 1970 年 1 月 1 日 00:00 UTC 纪元以来的秒数和微秒数。在内部,日期表示为天文儒略日数,而 DateTime 很奇怪(这可能是 Rails 覆盖它的原因)
    【解决方案3】:

    不幸的是,DateTime 类没有 Time 类中可用的便捷方法来执行此操作。您可以像这样将任何 DateTime 对象转换为 UTC:

    d = DateTime.now
    d.new_offset(Rational(0, 24))
    

    您可以使用以下命令从 UTC 切换回本地时间:

    d.new_offset(DateTime.now.offset)
    

    其中d 是UTC 时间的DateTime 对象。如果您希望这些作为方便的方法,那么您可以像这样创建它们:

    class DateTime
      def localtime
        new_offset(DateTime.now.offset)
      end
    
      def utc
        new_offset(Rational(0, 24))
      end
    end
    

    您可以在以下 irb 会话中看到这一点:

    d = DateTime.now.new_offset(Rational(-4, 24))
     => #<DateTime: 106105391484260677/43200000000,-1/6,2299161> 
    1.8.7 :185 > d.to_s
     => "2012-08-03T15:42:48-04:00" 
    1.8.7 :186 > d.localtime.to_s
     => "2012-08-03T12:42:48-07:00" 
    1.8.7 :187 > d.utc.to_s
     => "2012-08-03T19:42:48+00:00" 
    

    正如您在上面看到的,初始 DateTime 对象的偏移量为 -04:00(东部时间)。我在太平洋时间,偏移量为 -07:00。如前所述调用localtime 可以正确地将DateTime 对象转换为本地时间。在对象上调用 utc 会正确地将其转换为 UTC 偏移量。

    【讨论】:

      【解决方案4】:

      试试这个,在 Ruby 中工作:

      DateTime.now.to_time.utc
      

      【讨论】:

        【解决方案5】:

        如果您希望 Time.nowDateTime.now 在 UTC 时间响应,您可以设置 ENV。

        require 'date'
        Time.now #=> 2015-11-30 11:37:14 -0800
        DateTime.now.to_s #=> "2015-11-30T11:37:25-08:00"
        ENV['TZ'] = 'UTC'
        Time.now #=> 2015-11-30 19:37:38 +0000
        DateTime.now.to_s #=> "2015-11-30T19:37:36+00:00"
        

        【讨论】:

          【解决方案6】:

          在 irb 中:

          >>d = DateTime.now
          => #<DateTime: 11783702280454271/4800000000,5/12,2299161>
          >> "#{d.hour.to_i - d.zone.to_i}:#{d.min}:#{d.sec}"
          => "11:16:41"
          

          将时间转换为UTC。但正如发布的那样,如果它只是你可以使用的时间:

          Time.now.utc
          

          马上拿走。

          【讨论】:

            【解决方案7】:

            Time 类可以解析 DateTime 的字符串表示形式。

            > Time.parse(DateTime.now.to_s).utc
            => 2015-10-06 14:53:51 UTC
            

            【讨论】:

              猜你喜欢
              • 2011-06-16
              • 2011-05-19
              • 2012-07-07
              • 2011-05-05
              • 2023-03-18
              • 2011-05-02
              • 1970-01-01
              • 2014-09-22
              • 2021-08-22
              相关资源
              最近更新 更多