実践・上級問題チェック

問題 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)