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