Si d = date(2011, 1, 1)
est en UTC :
>>> from datetime import datetime, date
>>> import calendar
>>> timestamp1 = calendar.timegm(d.timetuple())
>>> datetime.utcfromtimestamp(timestamp1)
datetime.datetime(2011, 1, 1, 0, 0)
Si d
est dans le fuseau horaire local :
>>> import time
>>> timestamp2 = time.mktime(d.timetuple()) # DO NOT USE IT WITH UTC DATE
>>> datetime.fromtimestamp(timestamp2)
datetime.datetime(2011, 1, 1, 0, 0)
timestamp1
et timestamp2
peut différer si minuit dans le fuseau horaire local n'est pas la même instance horaire que minuit en UTC.
mktime()
peut retourner un résultat erroné si d
correspond à un heure locale ambiguë (par exemple, pendant le passage à l'heure d'été) ou si d
est une date passée(future) à laquelle le décalage utc aurait pu être différent et le C mktime()
n'a pas accès à la base de données tz sur la plateforme donnée. Vous pouvez utiliser pytz
(par exemple, via tzlocal.get_localzone()
) pour avoir accès à la base de données tz sur toutes les plateformes . Aussi, utcfromtimestamp()
peut échouer et mktime()
peut retourner un timestamp non-POSIX si "right"
le fuseau horaire est utilisé .
Pour convertir datetime.date
qui représente la date en UTC sans calendar.timegm()
:
DAY = 24*60*60 # POSIX day in seconds (exact value)
timestamp = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * DAY
timestamp = (utc_date - date(1970, 1, 1)).days * DAY
Comment puis-je obtenir une date convertie en secondes depuis l'époque selon l'UTC ?
Pour convertir datetime.datetime
(pas datetime.date
) qui représente déjà le temps en UTC à l'horodatage POSIX correspondant (a float
).
Python 3.3 et plus
datetime.timestamp()
:
from datetime import timezone
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
Note : Il est nécessaire de fournir timezone.utc
explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic explic .timestamp()
suppose que votre objet datetime naïf est dans le fuseau horaire local.
Python 3 (< 3.3)
Dans les documents relatifs à datetime.utcfromtimestamp()
:
Il n'existe pas de méthode pour obtenir l'horodatage à partir d'une instance de datetime, mais le timestamp POSIX correspondant à une instance de datetime dt peut être facilement calculé comme suit. Pour un dt naïf :
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
Et pour un dt conscient :
timestamp = (dt - datetime(1970,1,1, tzinfo=timezone.utc)) / timedelta(seconds=1)
Lecture intéressante : Heure de l'époque et heure du jour sur la différence entre Quelle heure est-il ? et Combien de secondes se sont écoulées ?
Voir aussi : datetime a besoin d'une méthode "epoch" (époque)
Python 2
Pour adapter le code ci-dessus à Python 2 :
timestamp = (dt - datetime(1970, 1, 1)).total_seconds()
où timedelta.total_seconds()
est équivalent à (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
calculée avec la division réelle activée.
from __future__ import division
from datetime import datetime, timedelta
def totimestamp(dt, epoch=datetime(1970,1,1)):
td = dt - epoch
# return td.total_seconds()
return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6
now = datetime.utcnow()
print now
print totimestamp(now)
Méfiez-vous problèmes de virgule flottante .
Sortie
2012-01-08 15:34:10.022403
1326036850.02
Comment convertir un conscient datetime
à un timestamp POSIX
assert dt.tzinfo is not None and dt.utcoffset() is not None
timestamp = dt.timestamp() # Python 3.3+
Sur Python 3 :
from datetime import datetime, timedelta, timezone
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
timestamp = (dt - epoch) / timedelta(seconds=1)
integer_timestamp = (dt - epoch) // timedelta(seconds=1)
Sur Python 2 :
# utc time = local time - utc offset
utc_naive = dt.replace(tzinfo=None) - dt.utcoffset()
timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()
0 votes
Duplicata possible de Comment convertir l'heure locale en UTC en Python ?
35 votes
Je ne suis pas sûr que je serais d'accord pour le marquer comme un doublon. Bien que les solutions soient similaires, les questions ne le sont pas. La première (celle-ci) consiste à créer un horodatage à partir d'un fichier
datetime.date
l'autre tente de convertir une représentation de chaîne de caractères d'un fuseau horaire à un autre. En tant que personne à la recherche d'une solution à ce problème, je ne peux pas conclure que cette dernière fournira la réponse que je recherche.6 votes
Datetime(date.year,date.month,date.day).timestamp()
4 votes
Duplicata possible de En Python, comment convertir un objet `datetime` en secondes ?
0 votes
Attention : mktime est jusqu'à 10x plus lent que les autres approches. Comme il n'est pas improbable que vous fassiez cela dans un chemin chaud, c'est important.