[解決!Python]datetime型の日付や時刻と、ISO 8601形式の文字列とを相互変換するには:解決!Python
datetimeクラスのisoformatメソッドとfromisoformatクラスメソッドを使って、datetimeオブジェクトをISO 8601形式の文字列表現に変換する方法と、その逆を行う方法を紹介する。
import datetime
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
jst_datetime = datetime.datetime(2021, 11, 16, 12, 34, 56, tzinfo=JST)
naive_datetime = datetime.datetime.now()
print(repr(jst_datetime))
#出力例:
#datetime.datetime(2021, 11, 16, 12, 34, 56, tzinfo=datetime.timezone(datetime.
#timedelta(seconds=32400), 'JST'))
print(f'jst: {jst_datetime}, timezone: {jst_datetime.tzname()}') #
print(f'naive: {naive_datetime}, timezone: {naive_datetime.tzname()}')
# 出力例
#jst: 2021-11-16 12:34:56+09:00, timezone: JST
#naive: 2021-11-12 13:36:27.275913, timezone: None
# 日付と時刻をISOフォーマットに書式化
jst_date = jst_datetime.isoformat()
naive_date = naive_datetime.isoformat()
print(jst_date) # 2021-11-16T12:34:56+09:00
print(naive_date) # 2021-11-12T13:36:27.275913
# 日付と時刻をISOフォーマットで書式化(時刻の要素として含めるものを指定)
jst_dt = jst_datetime.isoformat(timespec='minutes')
print(jst_dt)
naive_dt = naive_datetime.isoformat(timespec='seconds')
print(naive_dt)
# ISOフォーマットからdatetime.datetimeインスタンスを生成
mydatetime = datetime.datetime.fromisoformat(jst_dt)
print(repr(mydatetime))
# 出力結果:
#datetime.datetime(2021, 11, 16, 12, 34, tzinfo=datetime.timezone(datetime.
#timedelta(seconds=32400)))
mydatetime = datetime.datetime.fromisoformat(naive_dt)
print(repr(mydatetime))
# 出力結果:
#datetime.datetime(2021, 11, 12, 13, 36, 27)
ISO 8601で定められている「YYYY-MM-DDThh:mm:ss」形式の文字列表現への変換
Pythonに標準で付属のdatetimeモジュールには日付や時刻を扱うdatetimeクラスが含まれている。このクラスのisoformat(インスタンス)メソッドとfromisoformatクラスメソッドを使うと、ISO 8601で定められている「YYYY-MM-DDThh:mm:ss」形式の文字列表現に変換したり、この形式の文字列からdatetimeクラスのオブジェクトを生成したりできる。
以下に簡単な例を示す。ここでは以下のようにして、datetime型のオブジェクトを2つ作ったものとしよう。
import datetime
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
jst_datetime = datetime.datetime(2021, 11, 16, 12, 34, 56, tzinfo=JST)
naive_datetime = datetime.datetime.now()
print(repr(jst_datetime))
#出力例:
#datetime.datetime(2021, 11, 16, 12, 34, 56, tzinfo=datetime.timezone(datetime.
#timedelta(seconds=32400), 'JST'))
print(f'jst: {jst_datetime}, timezone: {jst_datetime.tzname()}') #
print(f'naive: {naive_datetime}, timezone: {naive_datetime.tzname()}')
# 出力例
#jst: 2021-11-16 12:34:56+09:00, timezone: JST
#naive: 2021-11-12 13:36:27.275913, timezone: None
1つのタイムゾーンはJSTで、もう1つはタイムゾーン情報を持たないナイーブなオブジェクトになっている。また、後者はdatetimeクラスのnowクラスメソッドで現在時刻を取得しているので、マイクロ秒単位でデータが得られている。
ISO 8601(の拡張形式)では、日付と時刻はセパレーター「T」を挟んで「YYYY-MM-DDThh:mm:ss」のように表現される。isoformatメソッドを呼び出すことで、上記の2つのdatetimeオブジェクトをこの形式の文字列表現に変換できる。
jst_dt = jst_datetime.isoformat()
naive_dt = naive_datetime.isoformat()
print(jst_dt) # 2021-11-16T12:34:56+09:00
print(naive_dt) # 2021-11-12T13:36:27.275913
タイムゾーン情報を持つjst_datetimeオブジェクトを変換した結果では最後に「+0900」が表示されている点と、マイクロ秒単位の値を保持しているnaive_datetimeオブジェクトを変換した結果では秒の後にピリオドとマイクロ秒が追加されている点に注目しよう。マイクロ秒が0の場合には、1つ目の例のようにその部分の表示は省略される。
isoformatメソッドでは、時刻をどの単位まで有効にするかをtimespec引数に指定できる。以下に例を示す。
jst_dt = jst_datetime.isoformat(timespec='minutes')
print(jst_dt) # 2021-11-16T12:34+09:00
naive_dt = naive_datetime.isoformat(timespec='seconds')
print(naive_dt) # 2021-11-12T13:36:27
1つ目の例では、timespec引数に'minutes'を指定しているので、分までの時間(12:34)が表示されている。2つ目の例では、timespec引数に'seconds'を指定しているので、秒までの時間(13:36:27)が得られている、つまりマイクロ秒単位のデータが切り捨てられているのが分かる。
datetimeモジュールのdateクラスとtimeクラスにもisoformatメソッドがある。date.isoformatメソッドは日付のみを変換し、time.isoformatメソッドは時刻のみを変換することを除けばdatetime.isoformatメソッドと同様である(timespec引数があるのはtime.isoformatメソッドのみとなる)。
「YYYY-MM-DDThh:mm:ss」形式の文字列からdatetimeクラスのオブジェクトを生成する
Copyright© Digital Advantage Corp. All Rights Reserved.