Bagaimana cara mendapatkan stempel waktu UTC di Ruby?


Jawaban:


118
time = Time.now.getutc

Rasional: Di mata saya, stempel waktu persis seperti itu: Sebuah titik waktu. Ini dapat secara akurat direpresentasikan dengan suatu objek. Jika Anda membutuhkan yang lain, nilai skalar, misalnya detik sejak zaman Unix, interval 100-ns sejak 1601 atau mungkin string untuk tujuan tampilan atau menyimpan stempel waktu dalam database, Anda dapat dengan mudah mendapatkannya dari objek. Tapi itu sangat tergantung pada tujuan penggunaan Anda.

Mengatakan bahwa »stempel waktu yang sebenarnya adalah jumlah detik sejak epoch Unix« sedikit kehilangan intinya, karena itu adalah salah satu cara untuk mewakili suatu titik waktu, tetapi juga membutuhkan informasi tambahan untuk mengetahui bahwa Anda berurusan dengan waktu dan bukan angka. Sebuah Timeobjek memecahkan masalah ini dengan baik dengan merepresentasikan suatu titik waktu dan juga secara eksplisit tentang apa itu .


96
Itu memberikan objek waktu, Anda harus ke Time.now.to_i untuk stempel waktu yang sebenarnya
rafamvc

3
Menurut pendapat saya, sebuah objek cukup timestampy dan Anda masih memiliki semua kebebasan yang Anda butuhkan. Menguranginya menjadi nilai skalar dalam banyak kasus tidak terlalu diperlukan.
Joey

2
Stempel waktu relatif terhadap zaman - tidak masalah di zona waktu mana Anda berada. Jawaban manzhikov lebih baik.
Ryan Mohr

2
Meskipun penjelasan yang bagus tentang mengapa tidak menggunakan stempel waktu unix, ini tidak menjawab pertanyaan OP (atau pertanyaan yang sama yang saya miliki ketika saya menemukan posting ini). Stempel waktu Unix diperlukan dalam banyak kasus (misalnya, untuk API). Bahkan setelah penjelasannya, jawaban ini tidak memberikan cara sebenarnya untuk mendapatkan stempel waktu.
stuckj

5
@stuckj, tidak ada pertanyaan yang menyebutkan stempel waktu Unix. Saya terus mendapatkan suara negatif untuk jawaban ini karena orang-orang tampaknya berpikir bahwa »stempel waktu == waktu Unix«, itulah penjelasannya.
Joey

250

Anda bisa menggunakan: Time.now.to_i.


1
Apakah lebih masuk akal untuk melakukan Time.now.getutc.to_i? Atau apakah itu pada dasarnya setara?
stuckj

20
stempel waktu sama di semua zona waktu. :)
manzhikov

3
Oh ya, ya. Pertanyaan Brainfart. :)
stuckj

inilah respon yang paling tepat!
Darlan D.

46

Format default tidak terlalu berguna, menurut saya. Saya lebih suka ISO8601 karena dapat diurutkan, relatif ringkas, dan dikenal luas:

>> require 'time'
=> true
>> Time.now.utc.iso8601
=> "2011-07-28T23:14:04Z"

1
Perhatikan bahwa metode ini berasal dari ActiveSupport, bukan di pustaka standar rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick

3
@ n0nick apakah Anda yakin, bahkan dalam versi 2.0? Saya tahu saya telah menggunakannya pada pemasangan "vanilla" tanpa rel dll /usr/share/ruby/2.0/time.rb.
Tim Sylvester

17

Biasanya stempel waktu tidak memiliki zona waktu.

% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true

1
to_fakan lebih baik
xis

1
tergantung situasinya.
Yuki Matsukura

1
Ketika tidak timestamp memiliki zona waktu?
Dennis

1
stempel waktu tidak terkait dengan zona waktu. Dengan kata lain, stempel waktunya adalah UTC.
Yuki Matsukura

1
@YukiMatsukura Sebenarnya, itu juga tidak sepenuhnya akurat. Stempel waktu bahkan tidak mewakili zona waktu mana pun, jadi "stempel waktu adalah UTC" sama halnya dengan "stempel waktu adalah kotoran gajah". Masalahnya ada pada representasi. Sebagian besar pengembang mewakilinya sebagai stempel waktu Unix (yang tidak menunjukkan UTC atau zona waktu lain karena itu hanya nilai integer).
The Pellmeister

10

jika Anda memerlukan stempel waktu yang dapat dibaca manusia (seperti yang dimiliki migrasi rel) ex. " 20190527141340 "

Time.now.utc.to_formatted_s(:number)  # using Rails

Time.now.utc.strftime("%Y%m%d%H%M%S") # using Ruby

7

Apa gunanya stempel waktu dengan perinciannya yang diberikan dalam hitungan detik? Saya merasa jauh lebih praktis bekerja dengan Time.now.to_f. Heck, Anda bahkan mungkin melemparkan to_s.sub('.','')untuk menyingkirkan titik desimal, atau melakukan typecast seperti ini: Integer(1e6*Time.now.to_f).


Terima kasih. Saya menggunakan ini: Integer(1e3*Time.now.to_f)sehingga stempel waktu ruby ​​sisi server saya sama dengan javascript sisi klienDate.now()
joshweir


-2

time = Time.zone.now()

Ini akan bekerja sebagai

irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC

Jonathan, dapatkah kamu memberitahuku apa yang salah dalam jawaban ini?
Asterisk

1
Ini tergantung pada Ruby apa yang merupakan zona waktu lokal. Ini akan bekerja seperti yang diharapkan hanya jika TZ lokal adalah UTC.
MasterCheffinator

-6

Cara yang tepat adalah melakukan a Time.now.getutc.to_iuntuk mendapatkan jumlah stempel waktu yang tepat karena hanya menampilkan bilangan bulat tidak harus selalu sama dengan stempel waktu utc karena perbedaan zona waktu.


7
Semua orang mengatakan itu, jadi mengapa hanya menyalinnya, tanpa informasi baru, terlambat 3 tahun?
Kaspar Lee

2
Dan tanpa tanda baca yang akan membuat 1 kalimat, yang agak terlalu panjang dan tidak sepenuhnya benar secara sintaksis, menjadi lebih jelas.
Emile Vrijdags
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.