web-dev-qa-db-fra.com

Ruby / Rails: convertir une date en un horodatage UNIX

Comment obtenir un horodatage UNIX (nombre de secondes depuis 1970 GMT) d'un objet Date dans une application Rails?

Je sais que Time#to_i renvoie un horodatage, mais si vous exécutez Date#to_time, puis obtenez les résultats de l'horodatage, le délai est d'environ un mois (vous ne savez pas pourquoi ...).

Toute aide est la bienvenue, merci!

Edit: OK, je pense avoir trouvé la solution. Je traitais une date plusieurs fois dans une boucle, et chaque fois que la date était légèrement décalée en raison d'un décalage de fuseau horaire, mon horodatage était finalement cadencé. Néanmoins, je serais intéressé de savoir s'il existe un moyen de le faire sans compter sur Date#to_time.

193
igul222

Le code date.to_time.to_i devrait fonctionner correctement. La session de console Rails ci-dessous montre un exemple:

>> Date.new(2009,11,26).to_time
=> Thu Nov 26 00:00:00 -0800 2009
>> Date.new(2009,11,26).to_time.to_i
=> 1259222400
>> Time.at(1259222400)
=> Thu Nov 26 00:00:00 -0800 2009

Notez que l'objet DateTime intermédiaire est à l'heure locale; l'horodatage peut donc être différent de plusieurs heures. Si vous souhaitez travailler à l'heure UTC, vous pouvez utiliser la méthode "to_utc" de DateTime.

333
David Grayson

Je reçois ce qui suit quand je l'essaie:

>> Date.today.to_time.to_i
=> 1259244000
>> Time.now.to_i
=> 1259275709

La différence entre ces deux chiffres est due au fait que Date ne stocke pas les heures, les minutes ou les secondes de l'heure actuelle. La conversion d'une Date en Time entraînera ce jour, minuit.

67
Ryan Bigg

Les options suggérées consistant à utiliser to_utc ou utc pour corriger le décalage d’heure locale ne fonctionnent pas. Pour moi, l'utilisation de Time.utc() a fonctionné correctement et le code comporte moins d'étapes:

> Time.utc(2016, 12, 25).to_i
=> 1482624000 # correct

contre

> Date.new(2016, 12, 25).to_time.utc.to_i
=> 1482584400 # incorrect

Voici ce qui se passe lorsque vous appelez utc après avoir utilisé Date....

> Date.new(2016, 12, 25).to_time
=> 2016-12-25 00:00:00 +1100 # This will use your system's time offset
> Date.new(2016, 12, 25).to_time.utc
=> 2016-12-24 13:00:00 UTC

... si clairement appeler to_i va donner le mauvais horodatage.

8
Gerry

Solution pour Ruby 1.8 lorsque vous avez un objet DateTime arbitraire:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"
8
Nowaker
DateTime.new(2012, 1, 15).to_time.to_i
4
wang sky