Je ne peux pas croire que je n'ai pas trouvé de réponse simple à cette.
Comment faire pour convertir un timestamp Unix (nombre de secondes depuis l'epoch) à Ruby DateTime?
Je ne peux pas croire que je n'ai pas trouvé de réponse simple à cette.
Comment faire pour convertir un timestamp Unix (nombre de secondes depuis l'epoch) à Ruby DateTime?
Désolé, bref moment de la synapse échec. Voici la vraie réponse.
Time.at(seconds_since_epoc_integer).to_datetime
Bref exemple (cela prend en compte le système actuel fuseau horaire):
$ date +%s
1318996912
$ irb
ruby-1.9.2-p180 :001 > require 'date'
=> true
ruby-1.9.2-p180 :002 > Time.at(1318996912).to_datetime
=> #<DateTime: 2011-10-18T23:01:52-05:00 (13261609807/5400,-5/24,2299161)>
Nouvelle mise à jour (UTC):
ruby-1.9.2-p180 :003 > Time.at(1318996912).utc.to_datetime
=> #<DateTime: 2011-10-19T04:01:52+00:00 (13261609807/5400,0/1,2299161)>
Dernière mise à Jour: j'ai comparé les meilleures solutions dans ce fil, tout en travaillant sur un service HA a une ou deux semaines, et a été surpris de trouver qu' Time.at(..)
surpasse DateTime.strptime(..)
.
ruby-2.0.0-p195 :001 > Benchmark.measure { \
[1318996912, 1318496912].each{ |i| \
DateTime.strptime("#{i}", '%s') \
} \
}
=> #<Benchmark ... @real=0.000255 ... @total=0.0>
ruby-2.0.0-p195 :002 > Benchmark.measure { \
[1318996912, 1318496912].each{ |i| \
Time.at(i).to_datetime \
} \
}
=> #<Benchmark ... @real=5.9e-05 ... @total=0.0>
Le Temps De La Zone De Manutention
Je veux juste préciser, même si @Vitaly a dit dans un commentaire, donc l'avenir les gens ne manquez pas cette distinction très importante.
DateTime.strptime("1318996912",'%s') # => Wed, 19 Oct 2011 04:01:52 +0000
suppose timestamp est dans le fuseau horaire LOCAL et nécessite l'secondes pour être une Chaîne de caractères et des sorties d'une Heure UTC de l'objet, alors que
Time.at(1318996912) # => 2011-10-19 00:01:52 -0400
suppose timestamp est en UTC, requiert normalement une FixNum argument, et renvoie un objet de Temps dans le fuseau horaire local.
Donc, même si j'ai passé par le même entier pour les deux méthodes, j'obtiens deux résultats différents en raison de la façon dont les méthodes de gérer les fuseaux horaires.
Argument D'Une Méthode De Clarification
Les docs aussi dire "Si un argument numérique est fourni, le résultat est en heure locale." qui fait sens, mais a été un peu difficile pour moi parce qu'ils ne donnent pas toutes des exemples de non-arguments entiers dans les docs. Ainsi, pour certains non-argument entier exemples:
Time.at("1318996912")
TypeError: can't convert String into an exact number
vous ne pouvez pas utiliser un argument de type Chaîne, mais vous pouvez utiliser un argument de Temps en Temps.et il sera de retour le résultat dans le fuseau horaire de l'argument:
Time.at(Time.new(2007,11,1,15,25,0, "+09:00"))
=> 2007-11-01 15:25:00 +0900
Une commande pour convertir la date en temps Unix format, puis à la chaîne
DateTime.strptime(Time.now.utc.to_i.to_s,'%s').strftime("%d %m %y")
Time.now.utc.to_i #Converts time from Unix format
DateTime.strptime(Time.now.utc.to_i.to_s,'%s') #Converts date and time from unix format to DateTime
enfin strftime est utilisé pour le format de la date
Exemple:
irb(main):034:0> DateTime.strptime("1410321600",'%s').strftime("%d %m %y")
"10 09 14"
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.