Convertir python datetime en epoch avec strftime
j'ai un temps en UTC à partir duquel je veux le nombre de secondes depuis l'époque.
j'utilise strftime pour le convertir en nombre de secondes. Prenons l'exemple du 1er avril 2012.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
1er avril 2012 UTC de l'époque est 1333238400 mais ce ci-dessus renvoie 1333234800 qui est différent d'une heure.
il semble donc que strftime prend en compte mon temps système et applique un décalage de fuseau 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 à moins que standard. (J'ai la portabilité des préoccupations).
6 réponses
Python ne supporte pas réellement %s comme argument pour strftime (si vous cochez http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior ce n'est pas dans la liste), la seule raison pour laquelle il fonctionne est parce que Python transmet les informations à strftime de votre système, qui utilise votre fuseau horaire local.
si vous voulez convertir un python datetime en secondes depuis l'époque, vous devez le faire explicitement:
>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0
en Python 3.3+ vous pouvez utiliser timestamp()
à la place:
>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0
j'ai eu de sérieux problèmes avec les fuseaux horaires et autres. La façon dont Python gère tout ce qui arrive est assez déroutante (pour moi). Les choses semblent bien fonctionner en utilisant 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
import time
from datetime import datetime
now = datetime.now()
time.mktime(now.timetuple())
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é, il ne serait pas me laisser de commentaires sur les réponses existant)
cela fonctionne en Python 2 et 3:
>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998
suivant les documents officiels... https://docs.python.org/2/library/time.html#module-time
si vous avez juste besoin d'un timestamp unix /époque, cette ligne fonctionne:
created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L
et dépend uniquement de datetime
fonctionne en python2 et python3