pythonでUTCをJSTに変換する(文字列⇔datetime)

UTCをJSTに変換する関数を作成します。
以下のように「YYYY-MM-DDThh:mm:ssZ」という文字列を「YYYY-MM-DD hh:mm:ss+09:00」というJSTに変換する関数です。

YYYY-MM-DDThh:mm:ssZ → YYYY-MM-DD hh:mm:ss+09:00

ソースは以下の通り。

import pytz
import dateutil.parser

class Sample():
  def __init__(self) -> None:
    pass

  def utc_to_jst(self, str_datetime):
    # dt_aware1 = dateutil.parser.parse(str_datetime) # 「YYYY-MM-DDThh:mm:ssZ」に対処できる。通常はこれでOK。
    dt_aware1 = dateutil.parser.parse(str_datetime, default=dateutil.parser.parse('00:00Z'))# 「YYYY-MM-DD hh:mm:ss 」にも対処する場合はこちらを使用する。
    dt_jst1 = dt_aware1.astimezone(pytz.timezone('Asia/Tokyo'))
    return str(dt_jst1)


if __name__ == '__main__':
  sample = Sample()
  str_jst = sample.utc_to_jst("2024-06-11T21:30:00Z")
  print(str_jst)

解説すると、

まず、渡された日時の文字列からparseしてdatetime型に変換します。
dt_aware1 = dateutil.parser.parse(str_datetime)

その後、そのdatetimeをTimeZoneを指定してJSTに変換する流れとなります。
dt_jst1 = dt_aware1.astimezone(pytz.timezone(‘Asia/Tokyo’))

例で記載すると、以下のように変換されることになります。


2024-06-11T21:30:00Z → 2024-06-12 06:30:00+09:00

ここで注意したいのは、「2024-06-11 21:30:00」といった、タイムゾーン指定がない文字列を渡すと、デフォルトでローカル時間のdatetimeが生成されてしまいます。

そうなると、以下のように、最初からJSTとみなされて、変換後も日時が変わらない状態となってしまいます。

2024-06-11 21:30:00 → 2024-06-11 21:30:00+09:00

それに対処するために、タイムゾーン指定が無い場合はデフォルトのタイムゾーンを指定し、UTCとしてあげるようにすると良いです。


dateutil.parser.parse(str_datetime, default=dateutil.parser.parse(’00:00Z’))


の部分ですね。