Comment obtenir l'horodatage UTC en Ruby?


Réponses:


117
time = Time.now.getutc

Justification: À mes yeux, un horodatage est exactement cela: un point dans le temps. Cela peut être représenté avec précision avec un objet. Si vous avez besoin d'autre chose, d'une valeur scalaire, par exemple secondes depuis l'époque Unix, intervalles de 100 ns depuis 1601 ou peut-être une chaîne à des fins d'affichage ou de stockage de l'horodatage dans une base de données, vous pouvez facilement l'obtenir à partir de l'objet. Mais cela dépend beaucoup de votre utilisation prévue.

Dire qu '"un horodatage vrai est le nombre de secondes depuis l'époque Unix" manque un peu le point, car c'est une façon de représenter un point dans le temps, mais il a également besoin d'informations supplémentaires pour savoir même que vous avez affaire à une heure et non un nombre. Un Timeobjet résout bien ce problème en représentant un point dans le temps et en étant également explicite sur ce qu'il est .


93
Cela donne l'objet de temps, vous devriez à Time.now.to_i pour un horodatage vrai
rafamvc

3
À mon avis, un objet est suffisamment horodaté et vous avez toujours toute la liberté dont vous avez besoin. Le réduire à une valeur scalaire n'est dans la plupart des cas pas vraiment nécessaire.
Joey

2
Les horodatages sont relatifs à l'époque - peu importe le fuseau horaire dans lequel vous vous trouvez. La réponse de manzhikov est la meilleure.
Ryan Mohr

2
Bien qu'une belle explication de pourquoi ne pas utiliser un horodatage unix, cela ne répond pas à la question OP (ni à la même question que j'avais lorsque j'ai trouvé ce message). Les horodatages Unix sont requis dans de nombreux cas (par exemple, pour les API). Même après l'explication, cette réponse n'a pas donné le moyen réel d'obtenir l'horodatage.
stuckj

5
@stuckj, à aucun moment la question ne mentionne un horodatage Unix. Je continue simplement à recevoir des votes négatifs pour cette réponse parce que les gens semblent penser que «horodatage == heure Unix», d'où l'explication.
Joey

247

Vous pouvez utiliser: Time.now.to_i.


1
Serait-il plus logique de faire Time.now.getutc.to_i? Ou est-ce essentiellement équivalent?
stuckj

20
l'horodatage est le même dans tous les fuseaux horaires. :)
manzhikov

2
Oh ouais, duh. Question Brainfart. :)
stuckj

c'est la réponse la plus appropriée!
Darlan Dieterich

46

Le formatage par défaut n'est pas très utile, à mon avis. Je préfère ISO8601 car il est triable, relativement compact et largement reconnu:

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

1
Notez que cette méthode provient d'ActiveSupport, pas de la bibliothèque standard rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick

3
@ n0nick êtes-vous sûr, même en 2.0? Je sais que je l'ai utilisé sur des installations "vanilla" sans rails, etc., et c'est dans /usr/share/ruby/2.0/time.rb.
Tim Sylvester

15

L'horodatage n'a généralement pas de fuseau horaire.

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

1
to_fsera mieux
xis

1
dépend de la situation.
Yuki Matsukura

1
Quand ne l'horodatage a un fuseau horaire?
Dennis

1
l'horodatage n'est pas lié au fuseau horaire. En d'autres termes, l'horodatage est UTC.
Yuki Matsukura

1
@YukiMatsukura En fait, ce n'est pas tout à fait exact non plus. Un horodatage ne représente même aucun fuseau horaire, donc "l'horodatage est UTC" est vrai autant que "l'horodatage est la merde d'éléphant". Le problème est dans la représentation. La plupart des développeurs le représentent comme un horodatage Unix (qui n'indique pas UTC ou tout autre fuseau horaire car il s'agit simplement d'une valeur entière).
The Pellmeister

10

si vous avez besoin d'un horodatage lisible par l'homme (comme l'a fait la migration des rails) ex. " 20190527141340 "

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

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

7

À quoi sert un horodatage avec sa granularité donnée en secondes? Je trouve cela beaucoup plus pratique de travailler avec Time.now.to_f. Heck, vous pouvez même jeter un to_s.sub('.','')pour se débarrasser du point décimal, ou effectuer une conversion de type comme ceci: Integer(1e6*Time.now.to_f).


Merci. J'ai utilisé ceci: Integer(1e3*Time.now.to_f)pour que mon horodatage ruby ​​côté serveur soit le même que le javascript côté clientDate.now()
joshweir


-2

time = Time.zone.now()

Cela fonctionnera comme

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

Jonathan, peux-tu me dire ce qui ne va pas dans cette réponse?
Asterisk

1
Cela dépend de ce que Ruby est le fuseau horaire local. Cela ne fonctionnera comme prévu que si la TZ locale est UTC.
MasterCheffinator

-6

La bonne façon est de faire une Time.now.getutc.to_ipour obtenir la quantité d'horodatage appropriée car le simple affichage de l'entier ne doit pas toujours être identique à l'horodatage utc en raison des différences de fuseau horaire.


7
Tout le monde a dit cela, alors pourquoi simplement le copier, sans nouvelle information, 3 ans de retard?
Kaspar Lee

2
Et sans ponctuation qui rendrait la phrase 1, qui est un peu trop longue et n'est pas complètement syntaxiquement correcte, plus claire.
Emile Vrijdags
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.