web-dev-qa-db-fra.com

Comment convertir python chaîne d'horodatage en époque?

J'ai la chaîne suivante:

mytime = "2009-03-08T00:27:31.807Z"

Comment le convertir en Epoch en python?

J'ai essayé:

import time
p = '%Y-%m-%dT%H:%M:%S'
int(time.mktime(time.strptime(s, p)))

Mais cela ne fonctionne pas avec le 31.807Z.

10
Rolando

Il se compose de deux parties:

  1. Convertissez la chaîne de temps en temps décomposé. Voir Comment analyser la date au format ISO en python?
  2. Convertir le temps UTC en "secondes depuis l'époque" (horodatage POSIX) .
#!/usr/bin/env python
from datetime import datetime

utc_time = datetime.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ")
Epoch_time = (utc_time - datetime(1970, 1, 1)).total_seconds()
# -> 1236472051.807

Si vous êtes sûr de vouloir ignorer des fractions de seconde et obtenir un résultat entier:

#!/usr/bin/env python
import time
from calendar import timegm

utc_time = time.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ")
Epoch_time = timegm(utc_time)
# -> 1236472051

Pour prendre en charge les horodatages qui correspondent à une seconde intercalaire telle que Wed July 1 2:59:60 MSK 2015, Vous pouvez tiliser une combinaison de time.strptime() et datetime (si vous vous souciez des secondes intercalaires, vous devrait également prendre en compte les microsecondes) .

17
jfs

Tu es absent .%fZ à partir de votre chaîne de format.

p = '%Y-%m-%dT%H:%M:%S.%fZ'

La bonne façon de convertir en Epoch est d'utiliser datetime:

from datetime import datetime

p = '%Y-%m-%dT%H:%M:%S.%fZ'
mytime = "2009-03-08T00:27:31.807Z"
Epoch = datetime(1970, 1, 1)
print((datetime.strptime(mytime, p) - Epoch).total_seconds())

Ou appelez int si vous voulez ignorer les fractions.

8

dateutil est la seule bibliothèque que j'ai trouvée qui traite correctement l'identificateur de décalage de fuseau horaire (Z)

pip install python-dateutil

puis

from dateutil.parser import parse as date_parse
print date_parse("2009-03-08T00:27:31.807Z")
#get timestamp

import calendar
dt =  date_parse("2009-03-08T00:27:31.807Z")
timestamp1 = calendar.timegm(dt.timetuple())
4
Joran Beasley

Code:

import datetime
Epoch = datetime.datetime(1970, 1, 1)

mytime = "2009-03-08T00:27:31.807Z"
myformat = "%Y-%m-%dT%H:%M:%S.%fZ"
mydt = datetime.datetime.strptime(mytime, myformat)
val = (mydt - Epoch).total_seconds()

print(val)
> 1236472051.81
repr(val)
> '1236472051.807'

Remarques:

  • Lors de l'utilisation de time.strptime(), le retour time.struct_time ne prend pas en charge la précision en une seconde près.
  • Le %fformat est pour les microsecondes. Lors de l'analyse, il n'est pas nécessaire que les 6 chiffres soient complets.
2
Nayuki