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
.
Il se compose de deux parties:
#!/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) .
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.
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())
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:
time.strptime()
, le retour time.struct_time
ne prend pas en charge la précision en une seconde près.%f
format est pour les microsecondes. Lors de l'analyse, il n'est pas nécessaire que les 6 chiffres soient complets.