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

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

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

## OSSの日付けデータはたぶんUTC前提
設定次第というところもあるけど、UTCでかつAware（TZをもつ）ケースが多いです。あとUNIXTIME（これは別物なので今回のテーマからは外す）。

## 確認手段
1. いろんなフォーマットをparserを介してみる
1. まずUTCであることを認識させたdatetimeを生成
1. それをJSTに変換する

## 考慮事項
タイムゾーンを持たない文字列時刻データはそもそも何処TZ基準のデータであるか？を意識して使い分ける必要があります。
ここ、注意ですよね。。。なのでそれ用の関数なり用意しておく感じで対応しましょう。

- UTC（のはず）をJSTに変換する
- JST（のはず）をJSTで生成する

人が判断です。


## UTC
```python
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も必要なのでやってみる

```python
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'))
```

## いろんなパターンを試してみる

```python
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変換を行ってみる

```python
# 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
```