web-dev-qa-db-ja.com

Python datetime.utcnow()が不正な日時を返す

datetime.utcnow()

この呼び出しは、UTC/GMTから1時間遅れた誤った日時を返します(チェックイン: http://www.worldtimeserver.com/current_time_in_UTC.asp )。

それはあるべきように機能していますか?

たとえば、今は戻ってきます:

2015-02-17 23:58:44.761000.

現在のUTC時間は23:58ではなく00:58です。

12
Johann Gomes

datetime.utcnow() OSが提供する値を使用します。

datetime.utcnow() 使用 gettimeofday(2) またはtime.time() on Python 2(およびgmtime(3)は、結果を分解時間に変換します)。

time.time()gettimeofday(2)ftime(3)time(2)を使用します。新しいCPythonバージョンでは clock_gettime(2)GetSystemTimeAsFileTime() を使用できます。

次のようにして自己整合性を確認できます。

_#!/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]))
_

以下は、WindowsでGetSystemTimeAsFileTime()を呼び出す(テストされていない)コードです 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()))
_

以下は clock_gettime() on Python 2 を呼び出すコードです。

10
jfs

私は5年遅れていることはわかっていますが、今夜も同じ問題がありました。私の経験では、問題の解決策は、認識されているUTC日時を使用することでした。

utc_dt_aware = datetime.datetime.now(datetime.timezone.utc)

グーグルで「utcnow()が間違っている」なら、これが最初の結果なので、とにかく答えた方がいいと思いました。

1
matkes