Come ottenere il timestamp UTC in Ruby?
Come ottenere il timestamp UTC in Ruby?
Risposte:
time = Time.now.getutc
Razionale: Ai miei occhi un timestamp è esattamente questo: un punto nel tempo. Questo può essere rappresentato con precisione con un oggetto. Se hai bisogno di qualcos'altro, un valore scalare, ad esempio secondi dall'epoca di Unix, intervalli di 100 ns dal 1601 o forse una stringa per scopi di visualizzazione o memorizzazione del timestamp in un database, puoi prontamente prenderlo dall'oggetto. Ma questo dipende molto dall'uso previsto.
Dire che "un vero timestamp è il numero di secondi dall'epoca di Unix" manca un po 'il punto, poiché questo è un modo di rappresentare un punto nel tempo, ma ha anche bisogno di informazioni aggiuntive per sapere anche che hai a che fare un tempo e non un numero. Un Time
oggetto risolve bene questo problema rappresentando un punto nel tempo ed essendo anche esplicito su cosa sia .
È possibile utilizzare: Time.now.to_i
.
La formattazione predefinita non è molto utile, secondo me. Preferisco ISO8601 in quanto ordinabile, relativamente compatto e ampiamente riconosciuto:
>> require 'time'
=> true
>> Time.now.utc.iso8601
=> "2011-07-28T23:14:04Z"
/usr/share/ruby/2.0/time.rb
.
Di solito il timestamp non ha fuso orario.
% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true
to_f
andrà meglio
se hai bisogno di un timestamp leggibile dall'uomo (come ha fatto la migrazione delle rotaie) es. " 20190527141340 "
Time.now.utc.to_formatted_s(:number) # using Rails
Time.now.utc.strftime("%Y%m%d%H%M%S") # using Ruby
A che serve un timestamp con la sua granularità espressa in secondi? Trovo molto più pratico lavorare con Time.now.to_f
. Heck, si può anche gettare un to_s.sub('.','')
sbarazzarsi del punto decimale, o eseguire un typecast come questo: Integer(1e6*Time.now.to_f)
.
Integer(1e3*Time.now.to_f)
modo che il mio timestamp sul lato server fosse lo stesso del lato client javascriptDate.now()
Time.utc(2010, 05, 17)
time = Time.zone.now()
Funzionerà come
irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC
Il modo corretto è quello di fare un Time.now.getutc.to_i
per ottenere la quantità di timestamp corretta poiché la semplice visualizzazione dell'intero non deve sempre essere la stessa del timestamp utc a causa delle differenze di fuso orario.