web-dev-qa-db-fra.com

Convertir une date/heure python en Epoch avec strftime

J'ai un temps en UTC à partir duquel je veux le nombre de secondes depuis Epoch.

J'utilise strftime pour le convertir en nombre de secondes. Prenant le 1er avril 2012 à titre d'exemple.

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

Le 1er avril 2012, UTC d’Epoch est 1333238400, mais la valeur ci-dessus renvoie 1333234800, ce qui diffère d’une heure. 

Donc, il semble que strftime prenne en compte mon temps système et applique un décalage horaire quelque part. Je pensais que datetime était purement naïf?

Comment puis-je contourner ça? Si possible, éviter d'importer d'autres bibliothèques sauf si elles sont standard. (J'ai des problèmes de portabilité).

144
Noel

Si vous voulez convertir une date/heure en python en secondes depuis Epoch, vous pouvez le faire explicitement:

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

Dans Python 3.3+, vous pouvez utiliser timestamp() à la place:

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0

Pourquoi vous ne devriez pas utiliser datetime.strftime('%s')

Python ne supporte pas réellement% s comme argument de strftime (si vous vérifiez à http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior ce n'est pas dans la liste ), la seule raison pour laquelle cela fonctionne est que Python transmet les informations à strftime de votre système, qui utilise votre fuseau horaire local.

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
284
jleahy

J'ai eu de graves problèmes avec les fuseaux horaires et autres. La façon dont Python gère tout cela s’avère assez déroutante (pour moi). Les choses semblent bien fonctionner avec le module calendrier (voir liens 1 , 2 , 3 et 4 ).

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400
86
BorrajaX
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())
31
srossross
import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(Désolé, cela ne me laisserait pas commenter la réponse existante)

14
Charles Plager

Cela fonctionne en Python 2 et 3:

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

Il suffit de suivre les documents officiels ... https://docs.python.org/2/library/time.html#module-time

2
Luis Pollo

si vous avez juste besoin d’un horodatage au format unix/epoch, cette ligne fonctionne:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

et ne dépend que de datetimeworks in python2 et python3

2
Marc Maxmeister

En Python 3.7

Renvoie une date/heure correspondant à une chaîne_date dans l'un des formats émis par date.isoformat () et datetime.isoformat (). Plus précisément, cette fonction prend en charge les chaînes dans le ou les formats AAAA-MM-JJ [* HH [: MM [: SS [.fff [fff]]]] [+ HH: MM [: SS [.ffffff]]]], où * peut correspondre à n'importe quel caractère.

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat

0
SuperNova

Pour une solution explicite indépendante du fuseau horaire, utilisez la bibliothèque pytz.

import datetime
import pytz

pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

Sortie (float): 1333238400.0

0
Moobie