2010-05-31 4 views

Répondre

90
time = Time.now.getutc 

Justification: Dans mes yeux un horodatage est exactement cela: un moment. Cela peut être représenté avec précision avec un objet. Si vous avez besoin d'autre chose, une valeur scalaire, par ex. 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 obtenir cela à partir de l'objet. Mais cela dépend beaucoup de votre utilisation prévue.

Dire que »un véritable horodatage est le nombre de secondes depuis l'époque Unix« est un peu manquant le point, car c'est une façon de représenter un point dans le temps, mais il a aussi besoin d'informations supplémentaires pour savoir même que vous avez affaire à un moment et non à un numéro. Un Time objet résout bien ce problème en représentant un point dans le temps et étant également explicite de ce que c'est.

+74

qui donne l'objet de temps, vous devriez à Time.now.to_i pour un véritable horodatage – rafamvc

+3

Dans mon opninion un objet est assez timestampy et vous avez encore toute la liberté dont tu as 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 - quel que soit le fuseau horaire dans lequel vous vous trouvez. La réponse de manzhikov est la meilleure. –

1

Time.utc(2010, 05, 17)

204

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

+11

l'horodatage est identique dans tous les fuseaux horaires. :) – manzhikov

+1

Oh ouais, mec. Question Brainfart. :) – stuckj

35

La mise en forme par défaut n'est pas très utile, à mon avis. Je préfère ISO8601 comme il est sortable, relativement compact et largement reconnu:

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

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

+1

@ n0nick êtes-vous sûr, même dans la version 2.0? Je sais que je l'ai utilisé sur des installations "vanilla" sans rails, etc., et cela se trouve dans '/ usr/share/ruby ​​/ 2.0/time.rb'. –

+1

juste essayé à nouveau. tu as raison. désolé à ce sujet – n0nick

-4

La bonne façon est de faire une Time.now.getutc.to_i pour obtenir la bonne quantité d'horodatage que l'affichage simplement l'entier ne doit pas toujours être le même que l'horodatage de utc en raison de différences de fuseau horaire.

+4

Tout le monde a dit cela, alors pourquoi juste le copier, sans nouvelles informations, 3 ans de retard? – Druzion

+0

Et sans ponctuation qui rendrait la phrase 1, qui est un peu trop longue et n'est pas complètement syntaxiquement correcte, plus claire. –

11

Généralement, l'horodatage n'a pas de fuseau horaire.

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

'to_f' sera mieux – xis

+1

dépend de la situation. –

+0

Quand * fait * un horodatage a un fuseau horaire? – Dennis

3

À 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 lancer un to_s.sub ('.', '') Pour se débarrasser du point décimal, ou effectuer un typecast comme ceci: Integer (1e6 * Time.now.to_f).

-1

time = Time.zone.now()

Il fonctionnera comme

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

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

+0

Cela dépend de ce que Ruby choses est le fuseau horaire local. Cela fonctionnera comme prévu seulement si le TZ local est UTC. – MasterCheffinator

Questions connexes