Python
Windows
datetime

datetime型のtimestamp()をWindowsで使用する際の注意点


0. 筆者環境

Windows 10 64bit

Python 3.6.7 64bit

datetime 4.2

zope.interface 4.5.0

pytz 2018.4

setuptools 40.6.2


1. 問題点・実例

UNIX環境で作業をしていたため、気づかなかったことを備忘として。

上記Windows環境で下記コードを実行すると次のエラーが発生する。


Windows環境

# Windows環境

from datetime import datetime

date = datetime.fromtimestamp(0)
print(date)

>>> 1970-01-01 09:00:00

print(date.timestamp())

>>> OSError: [Errno 22] Invalid argument

実はこのコードと全く同じものをUNIX環境で実行した場合は下記の出力となる。


UNIX環境

# UNIX環境

from datetime import datetime

date = datetime.fromtimestamp(0)
print(date)

>>> 1970-01-01 09:00:00

print(date.timestamp())

>>> 0.0

うーん、OS依存。これだからWindowsはクソ。

簡潔にこの問題を表すと、Windows環境でtimestamp()に値を渡す場合は86400以上の値を渡さなければエラーになるらしい。

※ max_fold_seconds = 24 * 3600 = 86400


timestamp()の引数に86399を指定 => エラー出力

# Windows環境

from datetime import datetime

date = datetime.fromtimestamp(86399)
print(date)

>>> 1970-01-02 08:59:59

print(date.timestamp())

>>> OSError: [Errno 22] Invalid argument


timestamp()の引数に86400を指定 => エラー出力無し

# Windows環境

from datetime import datetime

date = datetime.fromtimestamp(86400)
print(date)

>>> 1970-01-02 09:00:00

print(date.timestamp())

>>> 86400.0


2. 対処法

このバグ、実はもう報告されていた、対処は参考に全て乗っているので割愛。


3. 参考

https://bugs.python.org/issue29097

https://github.com/python/cpython/pull/2385