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
.
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.
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.
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.
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"
DateTime.new(2012, 1, 15).to_time.to_i