Ruby / Rails: Bir Tarihi UNIX zaman damgasına dönüştürme


202

Rails uygulamasındaki bir Date nesnesinden UNIX zaman damgasını (1970 GMT'den bu yana saniye sayısı) nasıl alabilirim?

Time#to_iBir zaman damgası döndürdüğünü biliyorum , ancak zaman damgasını Date#to_timealıp almak bir ay kadar kapalı bir şeyle sonuçlanıyor (neden olduğundan emin değilim ...).

Herhangi bir yardım takdir, teşekkürler!

Düzenleme: Tamam, ben bunu anladım düşünüyorum-Ben bir döngü içinde birkaç kez bir tarih işleme edildi ve her zaman tarih bir zaman dilimi uyuşmazlığı nedeniyle biraz taşındı, sonuçta benim zaman damgası bir ay kapalı olmak. Yine de, buna güvenmeden yapmanın bir yolu olup olmadığını bilmek isterim Date#to_time.

Yanıtlar:


350

Kod date.to_time.to_idüzgün çalışmalıdır. Aşağıdaki Rails konsol oturumu bir örnek gösterir:

>> 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

Ara DateTime nesnesinin yerel saat olduğunu unutmayın, bu nedenle zaman damgası beklediğinizden birkaç saat uzakta olabilir. UTC saatinde çalışmak istiyorsanız, DateTime'ın "to_utc" yöntemini kullanabilirsiniz.


3
DateTime yokto_utc
Yeşil

12
date.to_time.utcmuhtemelen kastettiği şeydir.
Adam Eberlin

3
Rails'te, ActiveSupport aracılığıyla, bir DateTime örneğinin bir utc () yöntemi vardır (getutc için de diğer addır)
Gokul

71

Denediğimde aşağıdakileri alıyorum:

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

Bu iki sayı arasındaki fark, Dategeçerli saatin saatlerini, dakikalarını veya saniyelerini saklamamasından kaynaklanmaktadır. Bir dönüştürme Datebir karşı Timeo gün, gece yarısından sonuçlanacaktır.


9

Yerel saat ofsetini düzeltmek to_utcveya utcdüzeltmek için önerilen seçenekler çalışmaz. Benim için Time.utc()doğru çalıştı kullanarak buldum ve kod daha az adım içerir:

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

vs

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

İşte kullandıktan sonra utc çağırdığınızda olan şey 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

... açıkça arama to_iyapmak yanlış zaman damgası verecektir.


8

Rasgele bir DateTime nesneniz olduğunda Ruby 1.8 için çözüm:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.