Відповіді:
d = DateTime.now.utc
На жаль!
Це, здається, працює в Rails, але не ванільна Рубі (і, звичайно, це питання задається)
d = Time.now.utc
Однак працює.
Чи є якась причина, якою вам потрібно користуватися, DateTime
а ні Time
? Time
має містити все необхідне:
irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009
DateTime.now.new_offset(0)
буде працювати в стандартному Ruby (тобто без ActiveSupport).
new_offset
аргумент методу за замовчуванням до 0
. Так DateTime.now.new_offset
може бути використаний і.
На жаль, для класу DateTime немає зручних методів для класу Time для цього. Ви можете конвертувати будь-який об’єкт DateTime в UTC так:
d = DateTime.now
d.new_offset(Rational(0, 24))
Ви можете переключитися з UTC на місцевий час, використовуючи:
d.new_offset(DateTime.now.offset)
де d
об’єкт DateTime за часом UTC. Якщо ви хочете, щоб це було як зручні методи, ви можете створити їх таким чином:
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.
Ви можете встановити ENV , якщо ви хочете , щоб ваші Time.now
і DateTime.now
щоб реагувати в UTC час.
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"