Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

shimajiri
株式会社エルバークスクリプト代表。 某情報通信会社でのIT営業を経てプログラマーを志し、現在はプログラマーと代表を兼任。 自身の勉強&趣味でQiitaに記事を書いている。スキルセットはPython,Java,JavaScript,Perl,Ruby on Rails,PHPなど。AWSも夜しか寝ないで勉強中。
https://ryota-shimajiri.github.io/portfolio/
lberc
暮らしを豊かにするものを創造していく企業、エルバークグループです。ウェアラブルデバイスを制御するモバイルアプリやWebAPIの開発、サーバー構築、モバイルアプリの第三者検証業務を請け負っています。
https://www.lberc-g.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away