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

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

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 
 DateTime.now.new_offset(0) 

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

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

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

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

 d.new_offset(DateTime.now.offset) 

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

 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抵消。 如前所述调用本地时间正确地将DateTime对象转换为本地时间。 正确调用对象的utc将其转换为UTC偏移量。

如果您希望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" 

在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 

并马上得到它。

DateTime的string表示可以被Time类parsing。

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

试试这个,在Ruby中工作:

 DateTime.now.to_time.utc