Ruby / Rails: conversion d'une date en horodatage UNIX

202

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

Je sais que Time#to_iretourne un horodatage, mais le faire Date#to_timeet ensuite obtenir l'horodatage entraîne un décalage d'environ un mois ( je ne sais pas pourquoi ...).

Toute aide est la bienvenue, merci!

Edit: OK, je pense que je l'ai compris - je traitais une date plusieurs fois dans une boucle, et chaque fois que la date a été déplacée un peu à cause d'une différence de fuseau horaire, ce qui a finalement conduit à mon horodatage à un mois de congé. Pourtant, je serais intéressé de savoir s'il existe un moyen de le faire sans compter sur Date#to_time.

igul222
la source

Réponses:

350

Le code date.to_time.to_idevrait 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 en heure locale, donc l'horodatage peut être à plusieurs heures de ce que vous attendez. Si vous souhaitez travailler en heure UTC, vous pouvez utiliser la méthode "to_utc" de DateTime.

David Grayson
la source
3
DateTime n'a pasto_utc
Vert
12
date.to_time.utcc'est probablement ce qu'il voulait dire.
Adam Eberlin
3
Dans Rails, via ActiveSupport, une instance DateTime a une méthode utc () (également aliasée à getutc)
Gokul
71

J'obtiens ce qui suit lorsque je l'essaye:

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

La différence entre ces deux nombres est due au fait que Datene stocke pas les heures, minutes ou secondes de l'heure actuelle. La conversion Datede a en Timeaura pour résultat ce jour-là, minuit.

Ryan Bigg
la source
9

Les options suggérées d'utiliser to_utcou utcde corriger le décalage horaire local ne fonctionnent pas. Pour moi, j'ai trouvé que l'utilisation Time.utc()fonctionnait correctement et le code implique 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_iva donner le mauvais horodatage.

Gerry
la source
8

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"
Nowaker
la source
4
DateTime.new(2012, 1, 15).to_time.to_i
wang sky
la source