Ruby / Rails: conversion d'une date en un horodatage UNIX
-
05-07-2019 - |
Question
Comment puis-je 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 l'exécution de Date # to_time
, puis l'obtention des résultats de l'horodatage donnent lieu à un délai d'un mois environ (vous ne savez pas pourquoi. ..).
Toute aide est appréciée, merci!
Edit: OK, je pense avoir trouvé la solution. Je traitais une date plusieurs fois en 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 a finalement pris fin dans un mois. . Néanmoins, je serais intéressé de savoir s’il est possible de le faire sans s’appuyer sur Date # to_time
.
La solution
Le code date.au_heure.à_i
devrait fonctionner correctement. La session de la 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 différer de plusieurs heures. Si vous souhaitez travailler à l’heure UTC, vous pouvez utiliser la méthode "to_utc" de DateTime.
Autres conseils
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 un Heure
donnera lieu à ce jour, minuit.
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"
Les options suggérées d'utilisation de to_utc
ou de utc
pour corriger le décalage de l'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
vs
> 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 un horodatage incorrect.
DateTime.new(2012, 1, 15).to_time.to_i