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


96

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

Answers:


154

d = DateTime.now.utc

糟糕!

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

d = Time.now.utc

确实可以。

有没有你需要使用任何理由DateTimeTimeTime应该包括您需要的一切:

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

因为我想要正确的转换日期,即格林尼治标准时间+10可以在第二天提前...
Ash Ash

2
时间会为您做到的。时间还包括日期部分,而不仅仅是一天中的时间。做一下Time.now.inspect看看。
DanSingerman

2
哦太好了。那么Date,Time和DateTime之间有什么区别呢?
Ash Ash

18
自1970年1月1日00:00 UTC以来的秒数和微秒数在内部存储了时间。日期在内部被表示为天文儒略日号,而DateTime只是很奇怪(这可能是Rails覆盖它的原因)
DanSingerman

168
DateTime.now.new_offset(0)

将在标准Ruby中运行(即不使用ActiveSupport)。


3
这实际上是该问题的最正确答案。
欧内斯特(Ernest)

2
这应该有更多的支持。DateTime与Time不同。我确实需要这个。
d11wtq 2012年

1
new_offset方法参数默认为0已经。因此DateTime.now.new_offset也可以使用。
Cryptor

8

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

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

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

d.new_offset(DateTime.now.offset)

dUTC时间中的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偏移量。


5

试试看,可以在Ruby中使用:

DateTime.now.to_time.utc

4

您可以设置一个ENV(如果需要)Time.nowDateTime.now在UTC时间内做出响应。

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"

2

在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

并立即获得。


1

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

> Time.parse(DateTime.now.to_s).utc
=> 2015-10-06 14:53:51 UTC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.