Ruby / Rails: перетворення дати в часову позначку UNIX


202

Як я можу отримати часову позначку UNIX (кількість секунд після 1970 GMT) від об'єкта Date в додатку Rails?

Я знаю, що Time#to_iповертає часову позначку, але робити Date#to_timeі потім отримувати мітку призводить до чогось, що вимикається приблизно на місяць (не впевнений, чому ...).

Будь-яка допомога вдячна, дякую!

Редагувати: Гаразд, я думаю, я це зрозумів - я обробляв дату кілька разів у циклі, і кожен раз, коли дату було переміщено трохи через невідповідність часового поясу, в кінцевому рахунку, це призводило до того, що мій часовий відміток був місячним вихідним. І все-таки мені було б цікаво дізнатися, чи є спосіб зробити це, не покладаючись на це Date#to_time.

Відповіді:


350

Код date.to_time.to_iповинен справно працювати. Сеанс консолі Rails нижче показаний приклад:

>> Date.new(2009,11,26).to_time
=> Thu Nov 26 00:00:00 -0800 2009
>> Date.new(2009,11,26).to_time.to_i
=> 1259222400
>> Time.at(1259222400)
=> Thu Nov 26 00:00:00 -0800 2009

Зауважте, що проміжний об'єкт DateTime знаходиться за місцевим часом, тому часова марка може зайняти кілька годин, ніж очікується. Якщо ви хочете працювати в UTC час, ви можете використовувати метод DateTime "to_utc".


3
DateTime не маєto_utc
Зелений

12
date.to_time.utcпевно, що він мав на увазі.
Адам Еберлін

3
У Rails, через ActiveSupport, екземпляр DateTime має метод (UTC) (також псевдонім getutc)
Gokul

71

Коли я пробую це, я отримую наступне:

>> Date.today.to_time.to_i
=> 1259244000
>> Time.now.to_i
=> 1259275709

Різниця між цими двома числами пов’язана з тим, що Dateне зберігаються години, хвилини чи секунди поточного часу. Перетворення Dateдо Timeпризведе в той день, в опівночі.


9

Запропоновані варіанти використання to_utcабо utcвиправлення локального зміщення часу не спрацьовують. Для мене я виявив, що Time.utc()правильно працював, і код передбачає менше кроків:

> Time.utc(2016, 12, 25).to_i
=> 1482624000 # correct

проти

> Date.new(2016, 12, 25).to_time.utc.to_i
=> 1482584400 # incorrect

Ось що відбувається, коли ви телефонуєте utc після використання Date....

> Date.new(2016, 12, 25).to_time
=> 2016-12-25 00:00:00 +1100 # This will use your system's time offset
> Date.new(2016, 12, 25).to_time.utc
=> 2016-12-24 13:00:00 UTC

... так чітко закликаючи to_iдавати неправильну мітку часу.


8

Рішення для Ruby 1.8, коли у вас є довільний об'єкт DateTime:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.