Edited at

Python3のdatetimeに存在するnaiveとawareについて

Pythonの日付変換の処理を書いていた時にハマったので、

アウトプットしておきます。


環境

Python3.7


datetimeについて

Pythonでは日時や時間を利用する際に、標準ライブラリとしてdatetimeが用意されており、

datetimeにはnaiveとawareというものが存在します。

とりあえず試しに現在日時をそれぞれ別の方法で取得してみます。

※変数名が悪いとかはスルーしてください。

import time

from datetime import datetime

if __name__ == "__main__":

now1 = datetime.now()
print(now1)

time.sleep(3)

JST = timezone(timedelta(hours=+9), 'JST')
now2 = datetime.now(JST)
print(now2)

if now1 < now2:
print('hello world')

そうするとこのような例外が発生しました。

2019-07-31 19:07:06.168798

2019-07-31 19:07:09.170117+09:00
例外が発生しました: TypeError
can't compare offset-naive and offset-aware datetimes


ここに書かれていたnaiveとawareの違いについて

Pythonのドキュメントにも書いてありました。


aware オブジェクトは他の aware オブジェクトとの相対関係を把握出来るように、タイムゾーンや夏時間の情報のような、アルゴリズム的で政治的な適用可能な時間調節に関する知識を持っています。aware オブジェクトは解釈の余地のない特定の実時刻を表現するのに利用されます 。

naive オブジェクトには他の日付時刻オブジェクトとの相対関係を把握するのに足る情報が含まれません。あるプログラム内の数字がメートルを表わしているのか、マイルなのか、それとも質量なのかがプログラムによって異なるように、naive オブジェクトが協定世界時 (UTC) なのか、現地時間なのか、それとも他のタイムゾーンなのかはそのプログラムに依存します。Naive オブジェクトはいくつかの現実的な側面を無視してしまうというコストを無視すれば、簡単に理解でき、うまく利用することができます。



つまり…

naiveはタイムゾーン情報を持たないdatetimeオブジェクトで、

awareはタイムゾーン情報を持ったdatetimeオブジェクトと言い換えることが出来そうです。

さらにnaiveとawareは比較出来ないようです。

普通に考えて、どこの時間か分からないnow1と日本時間として設定したnow2を

比較出来る訳がなかったということですね。

間違いあればご指摘頂けると幸いです。


参考

datetime --- 基本的な日付型および時間型

https://docs.python.org/ja/3.7/library/datetime.html