如何在Ruby中将DateTime.now转换为UTC?
如果我有d = DateTime.now
,如何将“d”转换为UTC(具有适当的date)?
d = DateTime.now.utc
哎呀!
这似乎在Rails工作,但不是香草ruby(当然这是问题的要求)
d = Time.now.utc
但是工作。
有没有什么理由需要使用DateTime
而不是Time
? Time
应该包括你需要的一切:
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.now
和DateTime.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