如果我有d = DateTime.now,我如何将'd'转换为UTC(带有适当的日期)?
d = DateTime.now
pbpqsu0x1#
DateTime.now.new_offset(0)
字符串将在标准Ruby中工作(即没有ActiveSupport)。
xeufq47z2#
第一个月哎呀!我的天!这在Rails中似乎行得通,但在普通Ruby中行不通(当然,这也是问题所在)
d = Time.now.utc
字符串但确实有效。有什么原因需要使用DateTime而不是Time吗?Time应该包含您需要的所有内容:
DateTime
Time
irb(main):016:0> Time.now => Thu Apr 16 12:40:44 +0100 2009
型
enyaitl33#
不幸的是,DateTime类没有Time类中提供的方便方法来完成此操作。您可以像这样将任何DateTime对象转换为UTC:
d = DateTime.now d.new_offset(Rational(0, 24))
字符串您可以使用以下命令从UTC切换回本地时间:
d.new_offset(DateTime.now.offset)
型其中d是UTC时间中的DateTime对象。如果你喜欢这些方便的方法,那么你可以像这样创建它们:
d
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偏移量。
localtime
utc
q8l4jmvw4#
试试这个,在Ruby中工作:
DateTime.now.to_time.utc
字符串
bjg7j2ky5#
如果您希望Time.now和DateTime.now以UTC时间响应,则可以设置ENV。
Time.now
DateTime.now
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"
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
型马上就能拿到
ldxq2e6h7#
为了完整起见,如果您正在处理now并需要时区精度,那么从时间开始会容易得多。
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在某些方面更符合人体工程学。强烈建议查看完整的类文档,您可能会发现一些非常方便的转换和时区方法,您可能不知道:
例如,Time和DateTime都有一个#zone示例方法,它将返回您选择的时区(如果您指定了一个)或ENV["TZ"](如果设置了):
#zone
ENV["TZ"]
ENV['TZ'] = nil # => nil Time.now.zone # => "PST"
7条答案
按热度按时间pbpqsu0x1#
字符串
将在标准Ruby中工作(即没有ActiveSupport)。
xeufq47z2#
第一个月
哎呀!我的天!
这在Rails中似乎行得通,但在普通Ruby中行不通(当然,这也是问题所在)
字符串
但确实有效。
有什么原因需要使用
DateTime
而不是Time
吗?Time
应该包含您需要的所有内容:型
enyaitl33#
不幸的是,DateTime类没有Time类中提供的方便方法来完成此操作。您可以像这样将任何DateTime对象转换为UTC:
字符串
您可以使用以下命令从UTC切换回本地时间:
型
其中
d
是UTC时间中的DateTime对象。如果你喜欢这些方便的方法,那么你可以像这样创建它们:型
你可以在下面的irb会议中看到这一点:
型
正如你在上面看到的,初始DateTime对象有一个-04:00的偏移量(东部时间)。我在太平洋时间,偏移量是-07:00。按照前面描述的调用
localtime
可以正确地将DateTime对象转换为本地时间。在对象上调用utc
可以正确地将其转换为UTC偏移量。q8l4jmvw4#
试试这个,在Ruby中工作:
字符串
bjg7j2ky5#
如果您希望
Time.now
和DateTime.now
以UTC时间响应,则可以设置ENV。字符串
bwntbbo36#
在IRB:
字符串
将时间转换为utc。但如发布的,如果只是时间,您可以用途:
型
马上就能拿到
ldxq2e6h7#
为了完整起见,如果您正在处理
now
并需要时区精度,那么从时间开始会容易得多。字符串
然后,您可以轻松地操作此UTC日期时间,并根据需要将其转换回简单时间:
型
这可能很有用,因为DateTime的API在某些方面更符合人体工程学。强烈建议查看完整的类文档,您可能会发现一些非常方便的转换和时区方法,您可能不知道:
例如,
Time
和DateTime
都有一个#zone
示例方法,它将返回您选择的时区(如果您指定了一个)或ENV["TZ"]
(如果设置了):型