Як перетворити DateTime.now на UTC у Ruby?


96

Якщо я маю d = DateTime.now, як мені перетворити 'd' у UTC (із відповідною датою)?

Відповіді:


154

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

Тому що я хочу правильну дату перетворення, тобто GMT +10 може бути вперед наступного дня ...
Еш

2
Час зробить це для вас просто чудово. Час включає також частину дати, а не лише час дня. Зробіть Time.now.inspect, щоб подивитися.
DanSingerman

2
О солодкий. То яка різниця між датою, часом та датою часу?
Еш

18
Час зберігається внутрішньо як кількість секунд і мікросекунд з епохи, 1 січня 1970 року, 00:00 UTC. Дата, внутрішньо, представлена ​​як астрономічний Джуліанський номер, а DateTime - просто дивний (імовірно, чому Rails це
переорієнтовує

168
DateTime.now.new_offset(0)

буде працювати в стандартному Ruby (тобто без ActiveSupport).


3
І це насправді найбільш правильна відповідь на питання.
Ернест

2
Це повинно мати більше результатів. DateTime відрізняється від часу. Мені потрібно було саме це.
d11wtq

1
new_offsetаргумент методу за замовчуванням до 0. Так DateTime.now.new_offsetможе бути використаний і.
Криптор

8

На жаль, для класу 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.



4

Ви можете встановити 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"

2

У 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

і одразу дістати.


1

Рядове представлення DateTime може бути проаналізовано за класом Time.

> Time.parse(DateTime.now.to_s).utc
=> 2015-10-06 14:53:51 UTC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.