En Python, comment convertir les secondes depuis epoch en objet `datetime`?


248

Le timemodule peut être initialisé en quelques secondes depuis l'époque:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

Existe-t-il une manière élégante d'initialiser un datetime.datetimeobjet de la même manière?


3
pour l'opération inverse, allez ici: convertir un objet datetime en secondes
Trevor Boyd Smith

Réponses:


404

datetime.datetime.fromtimestamp fera, si vous connaissez le fuseau horaire, vous pouvez produire la même sortie qu'avec time.gmtime

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)

ou

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)

42
bizarrement, datetime.utcfromtimestampcrée un horodatage naïf. J'ai dû import pytzet utilisé datetime.fromtimestamp(1423524051, pytz.utc)pour créer un datetime conscient.
Matt

6
comme suite à ce qui précède, avec Python> = 3.2 vous ne devez pas importer la pytzbibliothèque si vous souhaitez que l'horodatage UTC - vous ne devez from datetime import datetime, timezonepuis l' appeler comme suit: datetime.fromtimestamp(1423524051, timezone.utc). Il a enregistré la bibliothèque supplémentaire à plusieurs reprises lorsque je n'ai besoin que du fuseau horaire UTC pytz.
phouse512

38

Secondes depuis l'époque datetimepour strftime:

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'

Il doit s'agir de datetime.fromtimestamp (1579366345) .strftime ('% Y-% m-% d% H:% M:% S')
vml19

26

À partir des documents, la méthode recommandée pour obtenir un objet datetime sensible au fuseau horaire en quelques secondes depuis epoch est:

Python 3 :

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2 , en utilisant pytz:

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)

Un lien vers la documentation dans vos sous-titres ("Python 3", "Python 2") serait utile - et je recommande également de changer leur ordre.
Adam Matan

Actualisé. Laisser la même commande, car cela correspond aux documents Python.
Meistro

vous n'avez pas pytzseulement besoin d'obtenir utcun objet tzinfo. Il est facile de le créer vous
jfs

9

Notez que datetime.datetime. fromtimestamp (timestamp) et. utcfromtimestamp (timestamp) échoue sur les fenêtres pour les dates antérieures au 1er janvier 1970 alors que les horodatages Unix négatifs semblent fonctionner sur les plateformes basées sur Unix. Les docs disent ceci:

" Cela peut déclencher ValueError, si l'horodatage est en dehors de la plage de valeurs prise en charge par la fonction C gmtime () de la plate-forme. Il est courant que cela soit limité aux années 1970 à 2038 "

Voir aussi Issue1646728


: o) oui, encore 23 ans pour le réparer
user3666197

5
vous pouvez utiliser utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp)pour contourner ce problème.
jfs
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.