datetime.utcnow()
Cet appel renvoie une date/heure incorrecte, retardée de 1 heure UTC/GMT (enregistrement: http://www.worldtimeserver.com/current_time_in_UTC.asp ).
Fonctionne-t-il comme il se doit?
Par exemple, il revient, en ce moment:
2015-02-17 23:58:44.761000.
L'heure UTC actuelle est: 00:58, pas 23:58
datetime.utcnow()
utilise les valeurs fournies par le système d'exploitation.
datetime.utcnow()
utilise gettimeofday(2)
ou time.time()
sur Python 2 ( et gmtime(3)
pour convertir le résultat en temps décomposé).
time.time()
utilise gettimeofday(2)
, ftime(3)
, time(2)
. Les versions plus récentes de CPython peuvent utiliser clock_gettime(2)
, GetSystemTimeAsFileTime()
.
Vous pouvez vérifier l'auto-cohérence comme suit:
#!/usr/bin/env python
import time
from datetime import datetime, timedelta
print(datetime.utcnow())
print(datetime(1970, 1, 1) + timedelta(seconds=time.time()))
print(datetime(*time.gmtime()[:6]))
Voici le code (non testé) qui appelle GetSystemTimeAsFileTime()
sous Windows basé sur la source CPython :
#!/usr/bin/env python
import ctypes.wintypes
from datetime import datetime, timedelta
def utcnow_microseconds():
system_time = ctypes.wintypes.FILETIME()
ctypes.windll.kernel32.GetSystemTimeAsFileTime(ctypes.byref(system_time))
large = (system_time.dwHighDateTime << 32) + system_time.dwLowDateTime
return large // 10 - 11644473600000000
print(datetime(1970, 1, 1) + timedelta(microseconds=utcnow_microseconds()))
Voici le code qui appelle clock_gettime()
on Python 2 .
Je sais que j'ai cinq ans de retard, mais j'ai eu le même problème ce soir. D'après mon expérience, la solution au problème était d'utiliser le datetime UTC conscient:
utc_dt_aware = datetime.datetime.now(datetime.timezone.utc)
Si vous google "utcnow () mal" c'est le premier résultat que vous obtenez, donc j'ai pensé qu'il serait bon de répondre de toute façon.