2009-11-26 26 views
170

Rails uygulamasında bir Date nesnesinden UNIX zaman damgasını (1970 GMT'den bu yana geçen saniye sayısı) nasıl alabilirim?Ruby/Rails: Bir UNIX zaman damgasına dönüştürme

Biliyorum Time#to_i bir zaman damgası döndürüyor, ancak Date#to_time yapıyor ve daha sonra yaklaşık bir ay kapalı olan bir sonuçta zaman damgası sonuçlanıyor (emin değilim neden ...).

Herhangi bir yardım için teşekkür ederiz, teşekkürler!

Düzenleme: Tamam, sanırım bunu çözdüm - Bir döngüde birkaç kez bir işlem gerçekleştiriyordum ve her seferinde zaman dilimi uyuşmazlığı nedeniyle biraz taşındı, sonuçta bir zaman damgası olmak için bir ay oldu kapatır. Yine de, Date#to_time'a güvenmeden bunu yapmanın herhangi bir yolu olup olmadığını bilmek istiyorum.

cevap

295

date.to_time.to_i kodu düzgün çalışmalıdır. damgası beklediğinizden kapalı bir kaç saat olabilir bu yüzden orta DateTime nesnesi, yerel saatle olduğunu

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

Not: Aşağıda Raylar konsol oturumu bir örnek gösterilmektedir. UTC saatinde çalışmak istiyorsanız, DateTime'ın "to_utc" yöntemini kullanabilirsiniz. Bunu denediğinizde

+2

DateTime, 'to_utc' – Green

+10

' date.to_time.utc' anlamına gelmiyor, muhtemelen ne demek istediğidir. –

+3

Raylarda, ActiveSupport aracılığıyla, bir DateTime örneğinin utc() yöntemi vardır (ayrıca getutc ile aynı şekilde adlandırılır) – Gokul

59

aşağıdaki alıyorum:

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

Bu iki sayı arasındaki fark Date geçerli zamanın saat, dakika veya saniye saklamaz olmasından kaynaklanmaktadır. Bir Date'un bir Time'a dönüştürülmesi, o gün, gece yarısı ile sonuçlanacaktır. Ruby 1.8 için

7

Çözüm Eğer keyfi bir DateTime nesne var: çalışmıyor ofset yerel saat düzeltmek için to_utc veya utc kullanmanın

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

önerilen seçenekler. Benim için Time.utc() doğru çalıştı ve kod az adımdan oluşur kullanarak bulundu:

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

vs

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

Eğer Date kullandıktan sonra utc çağırdığınızda ....

ne olduğudur
> 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 çağırarak O yanlış zaman damgası.

İlgili konular