python

【Python】現在時刻をISO8601形式で出力する方法をちゃちゃっと解説

今回はPythonで現在時刻をISO8601形式で出力する方法を解説します。

ISO 8601形式とは

ISO8601形式については以下の通り

参照:https://ja.wikipedia.org/wiki/ISO_8601

ISO 8601は、日付と時刻の表記に関するISOの国際規格である。この規格の主眼は、日付と時刻の記述順序が国や文化によってまちまちであるものを、大→小の順序(ビッグエンディアン big- endian)を貫徹して、日付・時刻の記述順序をただ一種類に標準化していることにある。また、時刻表現は24時制のみに限定している。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

ISO 8601は基本形式と拡張形式があります。

  • 基本形式: YYYYMMDDThhmmss+0900
  • 拡張形式: YYYY-MM-DDThh:mm:ss+09:00

今回は拡張形式で生成する方法になります。

実装方法

以下コードは日本時間でISO 8601形式の現在時刻を生成するコードです

from datetime import datetime, timedelta, timezone

# timezoneを生成
JST = timezone(offset=timedelta(hours=9))

# ミリ秒を削除した現在時刻を生成する
replace_jst_now = datetime.now(tz=JST).replace(microsecond=0)

# 日本時間 YYYY-MM-DD hh:mm:ss+09:00
print(replace_jst_now)

# ISO8601文字列型に変換
# 日本時間 YYYY-MM-DDThh:mm:ss+09:00
print(replace_jst_now.isoformat())

一つずつ解説していきます。

timezoneでタイムゾーンを日本に設定

datetime.now()を使うと、現在時刻を生成することができます。

この場合、now()で生成される時間はローカル時刻に依存します。

例えばLinuxのローカル時刻がUTCで作業している場合は、now()で作成されるのはUTCの現在時刻になります。

日本時刻にしたい場合はnow()のときにtzオプションにタイムゾーンを指定することで生成可能です。

タイムゾーンの設定はこのコードで実現しています

from datetime import datetime, timedelta, timezone

# timezoneを生成
JST = timezone(offset=timedelta(hours=9))

timezone()のoffsetにtimedeltaを指定することでJSTのタイムゾーンを生成することができます。

https://docs.python.org/ja/3/library/datetime.html#timezone-objects

今回は日本時刻なのでtimedelta(hour=9)にしましたが、違う国の標準時刻にしたい場合はhour=9の箇所を変更すれば良いです。

ちなみにオフセットは協定世界時との差のことです。

協定世界時はUTCですね。

各国とのオフセットはこちらが参考になります。

https://www.hulft.com/help/ja-jp/WebFT-V3/COM-ADM/Content/WEBFT_ADM_COM/TimeZone/timezonelist.htm

ISO 8601形式の日本時間を生成

タイムゾーンを生成したら後はdatetime.now()でtzオプションにタイムゾーンを指定すれば日本時間の現在時刻を生成できます。

また、今回のコードではミリ秒が不要のためreplace()を使用してミリ秒を切り取っています。

from datetime import datetime, timedelta, timezone

# ミリ秒を削除した現在時刻を生成する
replace_jst_now = datetime.now(tz=JST).replace(microsecond=0)

これで目的である【YYYY-MM-DDThh:mm:ss+09:00】にすることができます。

また、datetime型からstr型に変換したい場合はisoformat()メソッドが便利です。

isoformat()メソッドを使うことでISO形式を崩すことなく文字列型に変換できます。

# ISO8601文字列型に変換
# 日本時間 YYYY-MM-DDTHH:mm:ss+09:00
print(replace_jst_now.isoformat())

また、文字列のISO形式をdatetime型に変換する場合は、datetime.fromisoformat()を使用します。

from datetime import datetime

# 文字列→datetime型に変換
str_iso = "2022-01-01T00:00:00+09:00"
iso_time = datetime.fromisoformat(str_iso)

# 2022-01-01 00:00:00+09:00
print(iso_time)

まとめ

今回はPythonで現在時刻をISO8601形式で出力する方法を解説しました。

ポイントです。

  • 日本時刻で生成する場合は先にtimezone()でタイムゾーンを生成する。
  • datetime.now()のtzオプションにタイムゾーンを指定する。
  • datetime型からstr型へはisoformat()
  • str型からdatetime型はdatetime.fromisoformat()

以上になります。