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

时间:2009-04-16 11:15:13

标签: ruby

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

7 个答案:

答案 0 :(得分:160)

DateTime.now.new_offset(0)

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

答案 1 :(得分:132)

<击> d = DateTime.now.utc

糟糕!

这似乎适用于Rails,但不适用于vanilla Ruby(当然这就是问题所在)

d = Time.now.utc

是否有效。

是否有任何理由需要使用DateTime而不是TimeTime应该包含您需要的所有内容:

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

答案 2 :(得分:8)

不幸的是,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偏移量。

答案 3 :(得分:3)

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

答案 4 :(得分:2)

试试这个,适用于Ruby:

DateTime.now.to_time.utc

答案 5 :(得分:1)

在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

然后马上把它拿走。

答案 6 :(得分:1)

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

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