【发布时间】:2009-04-16 11:15:12
【问题描述】:
如果我有d = DateTime.now,如何将“d”转换为 UTC(带有适当的日期)?
【问题讨论】:
标签: ruby
如果我有d = DateTime.now,如何将“d”转换为 UTC(带有适当的日期)?
【问题讨论】:
标签: ruby
DateTime.now.new_offset(0)
将在标准 Ruby 中工作(即没有 ActiveSupport)。
【讨论】:
new_offset 方法参数已经默认为 0。所以DateTime.now.new_offset也可以使用。
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 类没有 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 偏移量。
【讨论】:
试试这个,在 Ruby 中工作:
DateTime.now.to_time.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
马上拿走。
【讨论】:
Time 类可以解析 DateTime 的字符串表示形式。
> Time.parse(DateTime.now.to_s).utc
=> 2015-10-06 14:53:51 UTC
【讨论】: