今回は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()
以上になります。