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 le 1er avril 2012 comme exemple.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
Le 1er avril 2012, l'UTC de l'époque est 1333238400, mais ce qui précède renvoie 1333234800, ce qui est différent d'une heure.
Il semble donc que le strftime prenne en compte l'heure de mon système et applique un décalage de fuseau horaire quelque part. Je pensais que datetime était purement naïf?
Comment contourner cela? Si possible en évitant d'importer d'autres bibliothèques sauf standard. (J'ai des problèmes de portabilité).
datetime.datetime.timestamp(datetime.datetime.utcnow())
Réponses:
Si vous voulez convertir un datetime python en secondes depuis epoch, vous pouvez le faire explicitement:
Dans Python 3.3+, vous pouvez utiliser à la
timestamp()
place:Pourquoi vous ne devriez pas utiliser
datetime.strftime('%s')
Python ne prend pas réellement en charge% s comme argument de strftime (si vous vérifiez sur http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior ce n'est pas dans la liste), le seul la raison pour laquelle cela fonctionne est parce que Python transmet les informations au strftime de votre système, qui utilise votre fuseau horaire local.
la source
.strftime("%s")
: il n'est pas pris en charge, il n'est pas portable, il peut produire silencieusement un mauvais résultat pour un objet datetime conscient, il échoue si l'entrée est en UTC (comme dans la question) mais le fuseau horaire local n'est pas UTCAttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
td.seconds + td.days*24*3600
. Cela supprime la partie microsecondes.J'ai eu de sérieux problèmes avec les fuseaux horaires et autres. La façon dont Python gère tout cela est assez déroutante (pour moi). Les choses semblent bien fonctionner avec le module calendrier (voir liens 1 , 2 , 3 et 4 ).
la source
aprilFirst
dans cet exemple, il s'agissait d'une instance «consciente» et utilisait un fuseau horaire différent du fuseau horaire du système, le résultat ne serait pas correct (le fuseau horaire est perdu lors de l'timetuple()
appel). Pour obtenir la bonne réponse pour un datetime «conscient», vous pouvez utiliserawaredt.timestamp()
sur Python 3 récent. Pour Python 2, c'est plus difficile; une façon consiste à utiliser laarrow
bibliothèque.arrow.get(awaredt).timestamp
le fera bien.datetime
objet, j'ai donc supposé que le "J'ai un temps en UTC" signifiait que l'OP avait undatetime
objet ignorant qui était supposé être en UTC pour lequel il voulait pour en obtenir unepoch
(s'ildatetime
s'avérait être conscient de TZ, cela pourrait en effet changer les choses). Aussi, gardez à l'esprit que cette réponse a presque 8 ans et que beaucoup de choses se sont produites depuis (arrow
sortie en 2013, par exemple)la source
time.time()
(mktime()
peut échouer pendant les transitions DST tout entime.time()
continuant à fonctionner). Et il ne répond à la question que si le fuseau horaire local est UTC (l'entrée dans la question est en UTC). Même si l'entrée représente une heure locale, ellemktime()
peut également échouer pour les dates passées / futures si elle n'utilise pas la base de données tz et si le fuseau horaire local peut avoir différents décalages utc au fil des ans, par exemple Europe / Moscou en 2010-2015 - - utilisez plutôt des heures UTC (comme dans la question) ou des objets datetime compatibles avec le fuseau horaire..now()
) en horodatage d'époque (retournée parmktime()
) . Si vous le lisez; vous comprenez pourquoi l'entrée UTC (utilisée dans la question) est (beaucoup) plus préférable qu'un objet datetime naïf représentant l'heure locale(Désolé, cela ne m'a pas permis de commenter la réponse existante)
la source
si vous avez juste besoin d'un horodatage en temps unix / epoch, cette ligne fonctionne:
et ne dépend que des
datetime
travaux en python2 et python3la source
Cela fonctionne en Python 2 et 3:
Juste en suivant les documents officiels ... https://docs.python.org/2/library/time.html#module-time
la source
Pour une solution explicite indépendante du fuseau horaire, utilisez la bibliothèque pytz.
Sortie (float): 1333238400.0
la source
En Python 3.7
https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat
la source