Come ottenere il timestamp UTC in Ruby?


Risposte:


117
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 Timeoggetto risolve bene questo problema rappresentando un punto nel tempo ed essendo anche esplicito su cosa sia .


93
Questo dà l'oggetto time, dovresti Time.now.to_i per un vero timestamp
rafamvc,

3
A mio avviso un oggetto è abbastanza timestampy e hai ancora tutta la libertà di cui hai bisogno. Ridurlo a un valore scalare nella maggior parte dei casi non è realmente necessario.
Joey,

2
I timestamp sono relativi all'epoca - non importa in quale fuso orario ti trovi. La risposta di manzhikov è la migliore.
Ryan Mohr,

2
Mentre una bella spiegazione del perché non usare un timestamp unix, questo non risponde alla domanda OP (né alla stessa domanda che ho fatto quando ho trovato questo post). I timestamp Unix sono richiesti in molti casi (ad es. Per le API). Anche dopo la spiegazione, questa risposta non ha dato il modo effettivo di ottenere il timestamp.
stuckj

5
@stuckj, in nessun caso la domanda menziona un timestamp Unix. Continuo a ottenere voti negativi per questa risposta perché la gente sembra pensare che »timestamp == tempo Unix«, da cui la spiegazione.
Joey,

247

È possibile utilizzare: Time.now.to_i.


1
Avrebbe più senso fare Time.now.getutc.to_i? O è essenzialmente equivalente?
stuckj

20
il timestamp è lo stesso in tutti i fusi orari. :)
manzhikov,

2
Oh sì, duh. Domanda Brainfart. :)
stuckj

questa è la risposta più appropriata!
Darlan Dieterich,

46

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"

1
Si noti che questo metodo proviene da ActiveSupport, non nella libreria standard rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick,

3
@n0nick sei sicuro, anche in 2.0? So di averlo usato su installazioni "vanilla" senza binari ecc., Ed è dentro /usr/share/ruby/2.0/time.rb.
Tim Sylvester,

15

Di solito il timestamp non ha fuso orario.

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

1
to_fandrà meglio
xis

1
dipende dalla situazione.
Yuki Matsukura,

1
Quando si ha un timestamp ha un fuso orario?
Dennis,

1
il timestamp non è correlato al fuso orario. In altre parole, il timestamp è UTC.
Yuki Matsukura,

1
@YukiMatsukura In realtà, neanche questo è del tutto esatto. Un timestamp non rappresenta nemmeno alcun fuso orario, quindi "timestamp è UTC" è vero tanto quanto "timestamp è cacca di elefante". Il problema è nella rappresentazione. La maggior parte degli sviluppatori lo rappresentano come timestamp Unix (che non indica UTC o qualsiasi altro fuso orario in quanto è solo un valore intero).
The Pellmeister,

10

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

7

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


Grazie. Ho usato questo: in Integer(1e3*Time.now.to_f)modo che il mio timestamp sul lato server fosse lo stesso del lato client javascriptDate.now()
joshweir


-2

time = Time.zone.now()

Funzionerà come

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

Jonathan, puoi dirmi cosa c'è che non va in questa risposta?
Asterisk

1
Questo dipende da ciò che Ruby rappresenta il fuso orario locale. Funzionerà come previsto solo se la TZ locale è UTC.
MasterCheffinator il

-6

Il modo corretto è quello di fare un Time.now.getutc.to_iper 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.


7
Lo hanno detto tutti gli altri, quindi perché copiarlo, senza nuove informazioni, con 3 anni di ritardo?
Kaspar Lee,

2
E senza punteggiatura che renderebbe la frase 1, che è un po 'troppo lunga e non completamente sintatticamente corretta, più chiara.
Emile Vrijdags,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.