57 votes

Convertir datetime en temps POSIX

Comment convertir un objet datetime ou date en un timestamp POSIX en python? Il existe des méthodes pour créer un objet datetime à partir d'un timestamp, mais je ne semble pas trouver de façons évidentes de faire l'opération dans le sens inverse.

3 votes

Les réponses à cette question ne sont plus à jour. Vous devriez utiliser la méthode .timestamp() des objets datetime.datetime comme indiqué ci-dessous. Veuillez marquer cela comme la réponse correcte.

0 votes

Assurez-vous également que lorsque vous appelez .timestamp(), vous utilisez un objet de date conscient du fuseau horaire, car les fuseaux horaires naïfs "sont supposés représenter l'heure locale".

66voto

kender Points 18446
import time, datetime

d = datetime.datetime.now()
print time.mktime(d.timetuple())

0 votes

Merci. Je savais que ça devait être quelque chose de stupide simpl, mais je n'arrivais pas à le comprendre.

0 votes

Il semble que selon la plateforme, le temps n'a pas de méthode mktime.

8 votes

Notez que cela donne l'heure locale, pas l'UTC. Pour l'UTC, consultez la réponse de fixermark.

23voto

fixermark Points 955

Pour les calculs en UTC, calendar.timegm est l'inverse de time.gmtime.

import calendar, datetime
d = datetime.datetime.utcnow()
print calendar.timegm(d.timetuple())

1 votes

Attention: calendar.timegm() s'attend à une entrée UTC mais le résultat (horodatage) n'est lié à aucun fuseau horaire. Il s'agit simplement du nombre de secondes écoulées depuis l'époque (== 1969-12-31T19:00:00-05:00 (New York) == 1970-01-01T00:00:00Z (UTC) == 1970-01-01T03:00:00+03:00 (Moscou)) -- un instant précis fixé dans le temps.

0 votes

Correction : en raison des secondes intercalaires, les "secondes depuis l'époque" ne sont pas des secondes écoulées SI depuis 1970-01-01 00:00:00+00:00. La fonction utc_to_tai() pourrait être utilisée pour calculer les secondes SI écoulées.

15voto

Clément Points 1439

Notez que Python inclut désormais (3.5.2) une méthode intégrée pour cela dans les objets datetime:

>>> import datetime
>>> now = datetime.datetime(2020, 11, 18, 18, 52, 47, 874766)
>>> now.timestamp() # Heure locale
1605743567.874766
>>> now.replace(tzinfo=datetime.timezone.utc).timestamp() # UTC
1605725567.874766 # Delta de 5 heures (Je suis en UTC-5)

4voto

gnu_lorien Points 101

En python, time.time() peut retourner les secondes sous forme d'un nombre à virgule flottante incluant une composante décimale avec les microsecondes. Afin de convertir une date/heure à cette représentation, vous devez ajouter la composante microsecondes car le timetuple direct ne l'inclut pas.

import time, datetime

posix_now = time.time()

d = datetime.datetime.fromtimestamp(posix_now)
no_microseconds_time = time.mktime(d.timetuple())
has_microseconds_time = time.mktime(d.timetuple()) + d.microsecond * 0.000001

print posix_now
print no_microseconds_time
print has_microseconds_time

0 votes

Ne pas utiliser l'heure locale pour un aller-retour (ts -> local -> ts). Cela pourrait ne pas fonctionner pendant les transitions DST. Vous pourriez facilement étendre timegm() pour inclure des microsecondes et l'utiliser pour les transformations ts -> utc -> ts.

2voto

Marc Points 28

Cela dépend

Votre objet datetime est-il conscient du fuseau horaire ou naïf ?

Conscient du fuseau horaire

Si c'est conscient, c'est simple (et recommandé)

from datetime import datetime, timezone
aware_date = datetime.now(tz=timezone.utc)
posix_timestamp = aware_date.timestamp()

comme date.timestamp() vous donne un "timestamp POSIX"

_NOTE : plus précis de l'appeler un timestamp de l'époque/unix car il peut ne pas être conforme à POSIX_

Naïf au fuseau horaire

Si ce n'est pas conscient du fuseau horaire (naïf), alors vous devez savoir dans quel fuseau horaire il était à l'origine afin que nous puissions utiliser replace() pour le convertir en un objet de date conscient du fuseau horaire. Supposons que vous l'ayez stocké/récupéré comme étant Naïf UTC. Voici un exemple :

from datetime import datetime, timezone
naive_date = datetime.utcnow()  # cette date est naïve, mais est basée sur UTC
aware_date = naive_date.replace(tzinfo=timezone.utc)  # cette date n'est plus naïve

# maintenant nous faisons comme avec la dernière

posix_timestamp = aware_date.timestamp()

Il est toujours préférable d'obtenir une date consciente du fuseau horaire dès que possible pour éviter les problèmes qui peuvent survenir avec les dates naïves (car Python suppose souvent qu'elles sont des heures locales et peut vous désorienter)

NOTE : soyez également prudent dans votre compréhension de l'époque car elle dépend de la plateforme

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X