0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

いろんなパターンの日付け変換をシンプルに対応する

Last updated at Posted at 2021-02-17

開発においてさまざまOSSを使用するとそれぞれが還元してくる日付データがあるわけなのですが、それがまたバラバラだったりします。といってそれぞれ用にフォーマットパターンを用意して人間が判断して適用するのもかなりいまいちに。。。

困ったなあWeb探索すると、いろいろ注意事項はあるようだけどdateutil'のparser`様ができる奴らしいという事がでてました。なるほど実現できれば便利なので検証してみます。

OSSの日付けデータはたぶんUTC前提

設定次第というところもあるけど、UTCでかつAware(TZをもつ)ケースが多いです。あとUNIXTIME(これは別物なので今回のテーマからは外す)。

確認手段

  1. いろんなフォーマットをparserを介してみる
  2. まずUTCであることを認識させたdatetimeを生成
  3. それを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
0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?