LoginSignup
4
2

More than 5 years have passed since last update.

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

Posted at

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

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2