414 votes

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?

670voto

Adam Eberlin Points 6183

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> 

392voto

steenslag Points 29662

DateTime.strptime peut poignée de secondes depuis l'epoch. Le nombre doit être convertie en une chaîne de caractères.

require 'date'
DateTime.strptime("1318996912",'%s')

76voto

WattsInABox Points 1349

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

10voto

Tej Points 94

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"

0voto

pjammer Points 5042

Si vous vouliez seulement une Date, vous pouvez le faire Date.strptime(invoice.date.to_s, '%s')invoice.date se présente sous la forme d'unFixnum et ensuite convertis en String.

Prograide.com

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.

Powered by:

X