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é).
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'
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
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é, cela ne me laisserait pas commenter la réponse existante)
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
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 datetime
works in python2 et python3
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
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