如何在Ruby中将DateTime.now转换为UTC?

Ash*_*Ash 93 ruby

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

Gre*_*ell 166

DateTime.now.new_offset(0)
Run Code Online (Sandbox Code Playgroud)

将使用标准Ruby(即没有ActiveSupport).

  • 这实际上是问题的最正确答案. (3认同)
  • 这应该有更多的赞成.DateTime与Time不同.我需要这个. (2认同)
  • “new_offset”方法参数默认为“0”。因此也可以使用“DateTime.now.new_offset”。 (2认同)

Dan*_*man 146

d = DateTime.now.utc

哎呀!

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

d = Time.now.utc
Run Code Online (Sandbox Code Playgroud)

然而,工作.

你有什么理由需要使用DateTime而不是Time吗?Time应该包括你需要的一切:

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

  • 时间内部存储为自1970年1月1日00:00 UTC世纪以来的秒数和微秒数.内部日期表示为天文朱利安日数,而日期时间很简单(这可能是Rails覆盖它的原因) (18认同)
  • 时间会为你做到这一点就好了.时间也包括日期部分,而不仅仅是一天中的时间.请Time.now.inspect看看. (2认同)
  • 哦太好了.那么Date,Time和DateTime之间的差异呢? (2认同)

Joe*_*son 8

不幸的是,DateTime类没有Time类中可用的便捷方法来执行此操作.您可以将任何DateTime对象转换为UTC,如下所示:

d = DateTime.now
d.new_offset(Rational(0, 24))
Run Code Online (Sandbox Code Playgroud)

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

d.new_offset(DateTime.now.offset)
Run Code Online (Sandbox Code Playgroud)

其中d是UTC时间的DateTime对象.如果你喜欢这些作为便利方法,那么你可以像这样创建它们:

class DateTime
  def localtime
    new_offset(DateTime.now.offset)
  end

  def utc
    new_offset(Rational(0, 24))
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以在以下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" 
Run Code Online (Sandbox Code Playgroud)

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


jer*_*ink 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"
Run Code Online (Sandbox Code Playgroud)


小智 5

试试这个,在 Ruby 中工作吗?

DateTime.now.to_time.utc
Run Code Online (Sandbox Code Playgroud)