Bagaimana Anda mengonversi cap waktu Unix (detik sejak zaman) ke Ruby DateTime?
369
DateTime.strptime
dapat menangani detik sejak zaman. Jumlahnya harus dikonversi ke string:
require 'date'
DateTime.strptime("1318996912",'%s')
%Q
tho.Time
diperlukan sebagai gantiDateTime
. Jadi gunakanTime.strptime("1318996912345",'%Q').to_f
dan Anda akan melihat milidetik dipertahankan, sementaraDateTime.strptime("1318996912345",'%Q').to_f
tidak melestarikannya.Maaf, saat singkat kegagalan sinaps. Inilah jawaban sebenarnya.
Contoh singkat (ini memperhitungkan zona waktu sistem saat ini):
Pembaruan lebih lanjut (untuk UTC):
Pembaruan Terbaru : Saya membuat benchmark solusi teratas di utas ini saat mengerjakan layanan HA satu atau dua minggu yang lalu, dan terkejut menemukan itu
Time.at(..)
mengungguliDateTime.strptime(..)
(pembaruan: menambahkan lebih banyak tolok ukur).sumber
Time.at
melebihiDateTime.strptime
. Yang terakhir harus mengurai string, yang umumnya jauh lebih lambat daripada mengambil nomor secara langsung.DateTime.strptime
karena itu menciptakan dua String baru setiap iterasi yang sangat mahal. Ini bukan hanya penguraian string seperti @claw berkataPenanganan Zona Waktu
Saya hanya ingin mengklarifikasi, meskipun ini telah dikomentari sehingga orang-orang masa depan tidak ketinggalan perbedaan yang sangat penting ini.
menampilkan nilai kembali dalam UTC dan membutuhkan detik untuk menjadi String dan output objek Waktu UTC, sedangkan
menampilkan nilai kembali di zona waktu LOCAL, biasanya memerlukan argumen FixNum, tetapi objek Waktu itu sendiri masih dalam UTC meskipun tampilan tidak.
Jadi meskipun saya melewati bilangan bulat yang sama untuk kedua metode, saya tampaknya dua hasil yang berbeda karena cara kerja kelas
#to_s
. Namun, karena @Eero harus mengingatkan saya dua kali tentang:Perbandingan kesetaraan antara dua nilai kembali masih mengembalikan benar. Sekali lagi, ini karena nilainya pada dasarnya sama (walaupun kelas berbeda,
#==
metode ini menangani Anda), tetapi#to_s
metode ini mencetak string yang berbeda secara drastis. Meskipun, jika kita melihat senarnya, kita dapat melihat mereka memang memiliki waktu yang sama, hanya dicetak di zona waktu yang berbeda.Metode Klarifikasi Argumen
Dokumen juga mengatakan "Jika argumen numerik diberikan, hasilnya adalah waktu setempat." yang masuk akal, tetapi sedikit membingungkan bagi saya karena mereka tidak memberikan contoh argumen non-integer dalam dokumen. Jadi, untuk beberapa contoh argumen non-integer:
Anda tidak bisa menggunakan argumen String, tetapi Anda bisa menggunakan argumen Time
Time.at
dan itu akan mengembalikan hasilnya di zona waktu argumen:Tolak ukur
Setelah berdiskusi dengan @AdamEberlin tentang jawabannya, saya memutuskan untuk menerbitkan tolok ukur yang sedikit berubah untuk membuat semuanya sederajat mungkin. Juga, saya tidak pernah ingin harus membangun ini lagi jadi ini adalah tempat yang baik untuk menyelamatkan mereka.
Time.at (int) .to_datetime ~ 2.8x lebih cepat
**** diedit agar tidak sepenuhnya dan sepenuhnya salah dalam segala hal ****
**** menambahkan tolok ukur ****
sumber
Time.at(1318996912) == DateTime.strptime("1318996912",'%s')
di zona waktu non-UTC dan Anda akan melihat!Time.use_zone "Samoa" do Time.at(1318996912) == DateTime.strptime("1318996912",'%s') end
untuk memverifikasi bahwa waktunya sama, tidak ada cap waktu LOCAL, dan dalam kedua kasus cap waktu Unix ditafsirkan sebagai dalam UTC.Time.at
menyajikan objek Waktu yang dihasilkan di zona waktu lokal, danDateTime.strptime
menyajikan objek DateTime yang dihasilkan di UTC, tetapi terlepas dari presentasi, mereka sama, karena mereka adalah momen yang setara dalam waktu.Time.at(1318996912) # => 2011-10-19 00:01:52 -0400
menampilkan nilai kembali dalam zona waktu LOKAL tampaknya tidak akurat ... Tolong verifikasi? Saya percaya pernyataan Anda hanya akan benar jika Anda menggunakanTime.zone.at(1318996912)
Satu perintah untuk mengubah waktu tanggal ke format Unix dan kemudian ke string
akhirnya strftime digunakan untuk memformat tanggal
Contoh:
sumber
Time.now.utc.to_i
.Ini memberi tahu Anda tanggal jumlah detik di masa mendatang sejak Anda menjalankan kode.
menempatkan (waktu)
sesuai dengan waktu saat ini saya menjawab pertanyaan yang dicetaknya
047-05-14 05:16:16 +0000
(1 miliar detik di masa depan)atau jika Anda ingin menghitung miliar detik dari waktu tertentu, itu dalam format
Time.mktime(year, month,date,hours,minutes)
menempatkan ("Saya akan berusia 1 Miliar detik pada:" + waktu)
sumber
Jika Anda ingin hanya Tanggal, Anda dapat melakukan
Date.strptime(invoice.date.to_s, '%s')
di manainvoice.date
datang dalam bentukFixnum
dan kemudian dikonversi keString
.sumber
Time.at(1500923406).to_date.to_s
=>"2017-07-24"