開発においてさまざまOSSを使用するとそれぞれが還元してくる日付データがあるわけなのですが、それがまたバラバラだったりします。といってそれぞれ用にフォーマットパターンを用意して人間が判断して適用するのもかなりいまいちに。。。
困ったなあWeb探索すると、いろいろ注意事項はあるようだけどdateutil'の
parser`様ができる奴らしいという事がでてました。なるほど実現できれば便利なので検証してみます。
OSSの日付けデータはたぶんUTC前提
設定次第というところもあるけど、UTCでかつAware(TZをもつ)ケースが多いです。あとUNIXTIME(これは別物なので今回のテーマからは外す)。
確認手段
- いろんなフォーマットをparserを介してみる
- まずUTCであることを認識させたdatetimeを生成
- それをJSTに変換する
考慮事項
タイムゾーンを持たない文字列時刻データはそもそも何処TZ基準のデータであるか?を意識して使い分ける必要があります。
ここ、注意ですよね。。。なのでそれ用の関数なり用意しておく感じで対応しましょう。
- UTC(のはず)をJSTに変換する
- JST(のはず)をJSTで生成する
人が判断です。
UTC
UTC = dateutil.tz.tzutc()
JST = dateutil.tz.gettz('Asia/Tokyo')
x = '2018-05-29T12:17:27.000Z'
date_utc = dateutil.parser.parse(x).astimezone(UTC)
date_utc
datetime.datetime(2018, 5, 29, 12, 17, 27, tzinfo=tzutc())
JST
とりあえずnowも必要なのでやってみる
JST = dateutil.tz.gettz('Asia/Tokyo')
datetime.datetime.now(JST)
よさげ
datetime.datetime(2021, 2, 17, 23, 42, 0, 522127, tzinfo=tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
いろんなパターンを試してみる
date_lst = [
'2018.05.29',
'2018-05-29T12:17:27Z',
'2018-05-29 12:17:27.13Z',
'2018-05-29 12:17:27.133860',
'2018-05-29 12:17:27.133860+00:00',
'2018-05-29 12:17:27.133860+05:00',
'May 29 2018 12:17PM',
'May 29 2018 at 12:17PM',
'May 29, 2018, 12:17:27',
'Tue, 05/29/2018, 12:17PM',
'Tue, 29 May, 2018',
'Tuesday, 29th May, 2018 at 12:17pm'
]
u = dateutil.tz.gettz('Asia/Tokyo')
for val in date_lst:
print(dateutil.parser.parse(val).replace(tzinfo=u))
print()
u = dateutil.tz.gettz('Asia/Tokyo')
for val in date_lst:
print(dateutil.parser.parse(val).astimezone(u))
なるほど、、、ちょっとはっきりしないけどUTCっぽい感じに。
でもこれをJTS変換してもフォーマット次第ではそのままというちょっとややこしい事に
2018-05-29 00:00:00+09:00
2018-05-29 12:17:27+09:00
2018-05-29 12:17:27.130000+09:00
2018-05-29 12:17:27.133860+09:00
2018-05-29 12:17:27.133860+09:00
2018-05-29 12:17:27.133860+09:00
2018-05-29 12:17:00+09:00
2018-05-29 12:17:00+09:00
2018-05-29 12:17:27+09:00
2018-05-29 12:17:00+09:00
2018-05-29 00:00:00+09:00
2018-05-29 12:17:00+09:00
2018-05-29 00:00:00+09:00
2018-05-29 21:17:27+09:00
2018-05-29 21:17:27.130000+09:00
2018-05-29 12:17:27.133860+09:00
2018-05-29 21:17:27.133860+09:00
2018-05-29 16:17:27.133860+09:00
2018-05-29 12:17:00+09:00
2018-05-29 12:17:00+09:00
2018-05-29 12:17:27+09:00
2018-05-29 12:17:00+09:00
2018-05-29 00:00:00+09:00
2018-05-29 12:17:00+09:00
UTC変換を明示してその後にJST変換を行ってみる
# parser.parseとの組み合わせでUTC->JST変換をやってみる
date_lst = [
'2018.05.29',
'2018-05-29T12:17:27Z',
'2018-05-29 12:17:27.13Z',
'2018-05-29 12:17:27.133860',
'2018-05-29 12:17:27.133860+00:00',
'2018-05-29 12:17:27.133860+05:00',
'May 29 2018 12:17PM',
'May 29 2018 at 12:17PM',
'May 29, 2018, 12:17:27',
'Tue, 05/29/2018, 12:17PM',
'Tue, 29 May, 2018',
'Tuesday, 29th May, 2018 at 12:17pm'
]
UTC = dateutil.tz.tzutc()
JST = dateutil.tz.gettz('Asia/Tokyo')
for val in date_lst:
print(dateutil.parser.parse(val).astimezone(UTC).strftime('%Y-%m-%d %H:%M:%S'))
print(dateutil.parser.parse(val).astimezone(UTC).astimezone(JST).strftime('%Y-%m-%d %H:%M:%S'))
print()
いい感じだ、これでいこう!
2018-05-28 15:00:00
2018-05-29 00:00:00
2018-05-29 12:17:27
2018-05-29 21:17:27
2018-05-29 12:17:27
2018-05-29 21:17:27
2018-05-29 03:17:27
2018-05-29 12:17:27
2018-05-29 12:17:27
2018-05-29 21:17:27
2018-05-29 07:17:27
2018-05-29 16:17:27
2018-05-29 03:17:00
2018-05-29 12:17:00
2018-05-29 03:17:00
2018-05-29 12:17:00
2018-05-29 03:17:27
2018-05-29 12:17:27
2018-05-29 03:17:00
2018-05-29 12:17:00
2018-05-28 15:00:00
2018-05-29 00:00:00
2018-05-29 03:17:00
2018-05-29 12:17:00