如果我有d = DateTime.now
,如何将'd'转换为UTC(适当的日期)?
答案 0 :(得分:160)
DateTime.now.new_offset(0)
将在标准Ruby中工作(即没有ActiveSupport)。
答案 1 :(得分:132)
<击> d = DateTime.now.utc
击>
糟糕!
这似乎适用于Rails,但不适用于vanilla Ruby(当然这就是问题所在)
d = Time.now.utc
是否有效。
是否有任何理由需要使用DateTime
而不是Time
? Time
应该包含您需要的所有内容:
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.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"
答案 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