実践・上級問題チェック
問題 21 /40
次のタイムゾーンに関するコードのうち、誤っているものはどれか。
選択 1
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
選択 2
from datetime import datetime
now = datetime.now()
utc = now.astimezone('UTC')
選択 3
from datetime import datetime
from zoneinfo import ZoneInfo
now = datetime.now(ZoneInfo('Asia/Tokyo'))
utc = now.astimezone(ZoneInfo('UTC'))
選択 4
from datetime import datetime, timezone
start = datetime.now(timezone.utc)
end = datetime.now(timezone.utc)
diff = end - start
解説
選択肢2が正解です。
タイムゾーンを含むdatetimeオブジェクトをAwareオブジェクト、タイムゾーンを含まないdatetimeオブジェクトをNaiveオブジェクトと呼びます。
英語のawareは「気づいている、知っている、認識している」という意味で、ここでは「タイムゾーンを認識している」と覚えます。
英語のnaiveは「素朴」や「単純」という意味で、スペルはNative(ネイティブ)ではなくNaive(ナイーブ)です。
【選択肢1】
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
print(now)
▶︎
2025-12-15 05:20:39.771862+00:00
正しい使い方です。
datetime.now(timezone.utc)は、世界標準時のAwareオブジェクトを生成します。世界標準時のAwareオブジェクトは最後に+00:00がつきます。
timezone.utcは標準ライブラリで提供されているUTCの定数です。datetime.timezoneに用意されている定数はtimezone.utcだけです。
【選択肢2】
from datetime import datetime
now = datetime.now()
utc = now.astimezone('UTC')
print(utc)
▶︎
TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'str'
誤った使い方です。
datetime.now()は、OSの現在時刻をもとにdatetimeオブジェクトを生成します。
生成されるオブジェクトは、タイムゾーン情報を持たないNaiveオブジェクトです。
Naiveオブジェクトにastimezone()を使うとAwareオブジェクトになりますが、選択肢2の場合は文字列のUTCを渡しているだけなのでエラーになります。
正しい記述は以下です。
from datetime import datetime
from zoneinfo import ZoneInfo
now = datetime.now()
utc = now.astimezone(ZoneInfo('UTC'))
print(utc)
▶︎
2025-12-15 05:20:39.771862+00:00
【選択肢3】
from datetime import datetime
from zoneinfo import ZoneInfo
now = datetime.now(ZoneInfo('UTC'))
utc = now.astimezone(ZoneInfo('Asia/Tokyo'))
print(utc)
▶︎
2025-12-15 14:22:13.640592+09:00
正しい使い方です。
astimezone()はAwareオブジェクトのタイムゾーンを変更することができます。
日本時間のAwareオブジェクトは最後に+09:00がつきます。
なお、世界標準時のAwareオブジェクトの生成は、選択肢3のようにZoneInfo('UTC')を使う方法と、選択肢1のようにtimezone.utcを使う方法があります。
【選択肢4】
from datetime import datetime, timezone
start = datetime.now(timezone.utc)
end = datetime.now(timezone.utc)
diff = end - start
print(diff)
▶︎
0:00:00.000314
正しい使い方です。
時刻の比較や差分計算は、Awareオブジェクト同士か、Naiveオブジェクト同士で行います。
AwareオブジェクトとNaiveオブジェクトで比較・計算すると、TypeErrorが発生します。
(公式書籍 p.168-169、174-175)