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’))
の部分ですね。