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?

Adam Matan
la source
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)
SilentGhost
la source
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'
Seganku
la source
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)
Meistro
la source
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

cbare
la source
: 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