it-swarm-id.com

Bagaimana cara mengubah cap waktu unix (detik sejak Zaman) ke Ruby DateTime?

Bagaimana Anda mengonversi cap waktu Unix (detik sejak Zaman) ke Ruby DateTime?

340
Tronathan

DateTime.strptime dapat menangani detik sejak Zaman. Jumlahnya harus dikonversi ke string:

require 'date'
DateTime.strptime("1318996912",'%s')
324
steenslag

Maaf, saat singkat kegagalan sinaps. Inilah jawaban sebenarnya.

require 'date'

Time.at(seconds_since_Epoch_integer).to_datetime

Contoh singkat (ini memperhitungkan zona waktu sistem saat ini):

$ date +%s
1318996912

$ irb

Ruby-1.9.2-p180 :001 > require 'date'
 => true 

Ruby-1.9.2-p180 :002 > Time.at(1318996912).to_datetime
 => #<DateTime: 2011-10-18T23:01:52-05:00 (13261609807/5400,-5/24,2299161)> 

Pembaruan lebih lanjut (untuk UTC):

Ruby-1.9.2-p180 :003 > Time.at(1318996912).utc.to_datetime
 => #<DateTime: 2011-10-19T04:01:52+00:00 (13261609807/5400,0/1,2299161)>

Pembaruan Terbar: Saya membuat tolok ukur solusi teratas di utas ini saat mengerjakan layanan HA satu atau dua minggu yang lalu, dan terkejut menemukan bahwa Time.at(..) mengungguli DateTime.strptime(..) (pembaruan: menambahkan lebih banyak tolok ukur).

# ~ % Ruby -v
#  => Ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin13.0]

irb(main):038:0> Benchmark.measure do
irb(main):039:1*   ["1318996912", "1318496912"].each do |s|
irb(main):040:2*     DateTime.strptime(s, '%s')
irb(main):041:2>   end
irb(main):042:1> end

=> #<Benchmark ... @real=2.9e-05 ... @total=0.0>

irb(main):044:0> Benchmark.measure do
irb(main):045:1>   [1318996912, 1318496912].each do |i|
irb(main):046:2>     DateTime.strptime(i.to_s, '%s')
irb(main):047:2>   end
irb(main):048:1> end

=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>

irb(main):050:0* Benchmark.measure do
irb(main):051:1*   ["1318996912", "1318496912"].each do |s|
irb(main):052:2*     Time.at(s.to_i).to_datetime
irb(main):053:2>   end
irb(main):054:1> end

=> #<Benchmark ... @real=1.5e-05 ... @total=0.0>

irb(main):056:0* Benchmark.measure do
irb(main):057:1*   [1318996912, 1318496912].each do |i|
irb(main):058:2*     Time.at(i).to_datetime
irb(main):059:2>   end
irb(main):060:1> end

=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>
602
Adam Eberlin

Penanganan Zona Wakt

Saya hanya ingin mengklarifikasi, meskipun ini telah dikomentari sehingga orang-orang masa depan tidak ketinggalan perbedaan yang sangat penting ini.

DateTime.strptime("1318996912",'%s') # => Wed, 19 Oct 2011 04:01:52 +0000

menampilkan nilai kembali dalam UTC dan membutuhkan detik untuk menjadi String dan output objek Waktu UTC, sedangkan

Time.at(1318996912) # => 2011-10-19 00:01:52 -0400

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 metode '#to_s kelas. Namun, karena @Eero harus mengingatkan saya dua kali tentang:

Time.at(1318996912) == DateTime.strptime("1318996912",'%s') # => true

Perbandingan kesetaraan antara dua nilai kembali masih mengembalikan benar. Sekali lagi, ini karena nilainya pada dasarnya sama (walaupun kelasnya berbeda, metode #== menangani ini untuk Anda), tetapi metode #to_s 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 Argumen Klarifikasi

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:

Time.at("1318996912")
TypeError: can't convert String into an exact number

anda tidak bisa menggunakan argumen String, tetapi Anda bisa menggunakan argumen Time ke Time.at dan itu akan mengembalikan hasilnya di zona waktu argumen:

Time.at(Time.new(2007,11,1,15,25,0, "+09:00"))
=> 2007-11-01 15:25:00 +0900

**** diedit agar tidak sepenuhnya dan sepenuhnya salah dalam segala hal ****

59
WattsInABox

Satu perintah untuk mengubah waktu tanggal ke format Unix dan kemudian ke string

    DateTime.strptime(Time.now.utc.to_i.to_s,'%s').strftime("%d %m %y")

    Time.now.utc.to_i #Converts time from Unix format
    DateTime.strptime(Time.now.utc.to_i.to_s,'%s') #Converts date and time from unix format to DateTime

akhirnya strftime digunakan untuk memformat tanggal

Contoh:

    irb(main):034:0> DateTime.strptime("1410321600",'%s').strftime("%d %m %y")
    "10 09 14"
8
Tejasvi Manmatha

Ini memberitahu Anda tanggal jumlah detik di masa depan dari saat Anda mengeksekusi kode.

time = Time.new + 1000000000 #date in 1 billion seconds

menempatkan (waktu)

menurut waktu saat ini saya menjawab pertanyaan yang tercetak 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)

time = Time.mktime(1987,8,18,6,45) + 1000000000

menempatkan ("Saya akan berusia 1 Miliar detik pada:" + waktu)

1
sbutterworth

Jika Anda menginginkan hanya Tanggal, Anda dapat melakukan Date.strptime(invoice.date.to_s, '%s') di mana invoice.date datang dalam bentuk anFixnum dan kemudian dikonversi ke String.

0
pjammer