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

gr8qqesn  于 12个月前  发布在  Ruby
关注(0)|答案(7)|浏览(182)

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

pbpqsu0x

pbpqsu0x1#

DateTime.now.new_offset(0)

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

xeufq47z

xeufq47z2#

第一个月
哎呀!我的天!
这在Rails中似乎行得通,但在普通Ruby中行不通(当然,这也是问题所在)

d = Time.now.utc

字符串
但确实有效。
有什么原因需要使用DateTime而不是Time吗?Time应该包含您需要的所有内容:

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

enyaitl3

enyaitl33#

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

q8l4jmvw

q8l4jmvw4#

试试这个,在Ruby中工作:

DateTime.now.to_time.utc

字符串

bjg7j2ky

bjg7j2ky5#

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

字符串

bwntbbo3

bwntbbo36#

在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


马上就能拿到

ldxq2e6h

ldxq2e6h7#

为了完整起见,如果您正在处理now并需要时区精度,那么从时间开始会容易得多。

Time.now.utc.to_datetime
#<DateTime: 2023-11-13T02:16:03+00:00 ((2460262j,8163s,564598000n),+0s,2299161j)>

字符串
然后,您可以轻松地操作此UTC日期时间,并根据需要将其转换回简单时间:

now = Time.now.utc.to_datetime
# => #<DateTime: 2023-11-13T02:17:26+00:00 ((2460262j,8246s,2810000n),+0s,2299161j)>
truncated = DateTime.new(now.year, now.month, now.day, now.hour, 0, 0)
# => #<DateTime: 2023-11-13T02:00:00+00:00 ((2460262j,7200s,0n),+0s,2299161j)>


这可能很有用,因为DateTime的API在某些方面更符合人体工程学。强烈建议查看完整的类文档,您可能会发现一些非常方便的转换和时区方法,您可能不知道:

例如,TimeDateTime都有一个#zone示例方法,它将返回您选择的时区(如果您指定了一个)或ENV["TZ"](如果设置了):

ENV['TZ'] = nil
# => nil
Time.now.zone
# => "PST"

相关问题