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).

130
demandé sur Noel 2012-07-31 18:59:57

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
252
répondu jleahy 2016-01-20 17:12:27

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
84
répondu BorrajaX 2017-05-23 10:31:35
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())
28
répondu srossross 2013-06-21 09:32:57
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)

14
répondu Charles Plager 2013-09-23 19:20:00

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

2
répondu Luis Pollo 2017-09-09 00:49:44

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

2
répondu Marc Maxson 2018-04-05 19:27:43