Ruby / Rails: mengonversi Tanggal ke stempel waktu UNIX

202

Bagaimana saya mendapatkan cap waktu UNIX (jumlah detik sejak 1970 GMT) dari objek Date di aplikasi Rails?

Saya tahu Time#to_imengembalikan cap waktu, tetapi melakukan Date#to_timedan kemudian mendapatkan cap waktu menghasilkan sesuatu yang mati sekitar sebulan (tidak yakin mengapa ...).

Bantuan apa pun dihargai, terima kasih!

Sunting: Oke, saya pikir saya sudah mengetahuinya- Saya sedang memproses sebuah kencan beberapa kali dalam satu lingkaran, dan setiap kali tanggal itu dipindahkan sedikit karena ketidakcocokan zona waktu, akhirnya mengarah ke stempel waktu saya menjadi bulan libur. Tetap saja, saya akan tertarik mengetahui apakah ada cara untuk melakukan ini tanpa mengandalkan Date#to_time.

igul222
sumber

Jawaban:

350

Kode date.to_time.to_iharus bekerja dengan baik. Sesi konsol Rails di bawah ini menunjukkan contoh:

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

Perhatikan bahwa objek DateTime perantara adalah dalam waktu lokal, jadi cap waktu mungkin beberapa jam dari yang Anda harapkan. Jika Anda ingin bekerja dalam waktu UTC, Anda dapat menggunakan metode DateTime "to_utc".

David Grayson
sumber
3
DateTime tidak punyato_utc
Hijau
12
date.to_time.utcmungkin itu yang dia maksud.
Adam Eberlin
3
Di Rails, melalui ActiveSupport, instance DateTime memang memiliki metode utc () (juga alias getutc)
Gokul
71

Saya mendapatkan yang berikut ketika saya mencobanya:

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

Perbedaan antara kedua angka ini adalah karena fakta yang Datetidak menyimpan jam, menit atau detik dari waktu saat ini. Konversi a Dateke Timewasiat menghasilkan pada hari itu, tengah malam.

Ryan Bigg
sumber
9

Opsi yang disarankan untuk menggunakan to_utcatau utcmemperbaiki offset waktu lokal tidak berfungsi. Bagi saya, saya menemukan menggunakan Time.utc()berfungsi dengan benar dan kode melibatkan lebih sedikit langkah:

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

vs.

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

Inilah yang terjadi ketika Anda memanggil utc setelah menggunakan 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

... begitu jelas menelepon to_iakan memberikan stempel waktu yang salah.

Gerry
sumber
8

Solusi untuk Ruby 1.8 ketika Anda memiliki objek DateTime yang sewenang-wenang:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"
Pembuat sekarang
sumber
4
DateTime.new(2012, 1, 15).to_time.to_i
langit wang
sumber