web-dev-qa-db-fra.com

Python datetime.utcnow () retournant une datetime incorrecte

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

12
Johann Gomes

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 .

10
jfs

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.

1
matkes