311 votes

En Python, comment convertir les secondes depuis l'époque en un objet `datetime` ?

Le site time peut être initialisé en utilisant les 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 un moyen élégant d'initialiser un datetime.datetime de la même manière ?

4 votes

Pour l'opération inverse, allez ici : convert-a-datetime-object-to-seconds

497voto

SilentGhost Points 79627

datetime.datetime.fromtimestamp fera l'affaire, si vous connaissez le fuseau horaire, vous pourrez produire le même résultat 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)

51 votes

Bizarrement, datetime.utcfromtimestamp crée un timestamp naïf. J'ai dû import pytz et utiliser datetime.fromtimestamp(1423524051, pytz.utc) pour créer une date consciente.

20 votes

Pour faire suite à ce qui précède, avec Python >= 3.2, il n'est pas nécessaire d'importer l'élément pytz si vous ne voulez que l'horodatage UTC - il suffit de from datetime import datetime, timezone puis l'appeler comme suit : datetime.fromtimestamp(1423524051, timezone.utc) . Il a permis d'économiser la bibliothèque supplémentaire de nombreuses fois lorsque je n'avais besoin que du fuseau horaire UTC à partir de pytz .

50voto

Seganku Points 81

Secondes depuis l'époque jusqu'à datetime à strftime :

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

0 votes

Ce devrait être datetime.fromtimestamp(1579366345).strftime('%Y-%m-%d %H:%M:%S')

0 votes

@vml19, cela dépend si datetime a été importé de datetime ou non ( import datetime vs. from datetime import datetime ).

39voto

Meistro Points 2324

D'après la documentation, la méthode recommandée pour obtenir un objet datetime avec fuseau horaire à partir des secondes depuis l'époque est la suivante :

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)

10voto

cbare Points 1673

Notez que datetime.datetime. de l'horodatage (horodatage) et . utcfromtimestamp (timestamp) échouent sous Windows pour les dates antérieures au 1er janvier 1970 alors que les timestamps unix négatifs semblent fonctionner sur les plateformes basées sur unix. Les docs disent ceci :

" Cela peut provoquer ValueError, si l'horodatage est en dehors de la plage des valeurs supportées par la fonction gmtime() de la plate-forme C. Il est courant que que cette fonction soit limitée aux années 1970 à 2038. "

Voir aussi Numéro 1646728

0 votes

:o) oui, il reste encore 23 ans pour le laisser se réparer

6 votes

Vous pourriez utiliser utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp) pour le contourner.

0 votes

C'est un problème. Il y a beaucoup de personnes qui sont nées avant 1970 ou le 31 décembre 1969 aux États-Unis ! Ces DOBs stockés dans Java peuvent alors se casser en per-opératoire.

4voto

Pour ceux qui veulent qu'il soit conforme à la norme ISO 8601, étant donné que les autres solutions n'ont pas la certification ISO 8601. T ni le décalage horaire (sauf Meistro Réponse de l'UE) :

from datetime import datetime, timezone
result = datetime.fromtimestamp(1463288494, timezone.utc).isoformat('T', 'microseconds')
print(result) # 2016-05-15T05:01:34.000000+00:00

Note, j'utilise fromtimestamp parce que si j'ai utilisé utcfromtimestamp J'aurais besoin d'une chaîne sur .astimezone(...) de toute façon pour obtenir le décalage.

Si vous ne voulez pas aller jusqu'à microseconds vous pouvez choisir une autre unité avec le isoformat() méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X