【Python】文字列⇒日付、日付⇒文字列の変換（str, datetime）（備忘録）

自分用メモ

文字列⇒日付（datetime）、日付（datetime）⇒文字列の変換

# 文字列から日付（datetime）への変換
`datetime.strptime(date_string, format)`にて変換

```python
from datetime import datetime

datetime_1 = '2021-03-21 01:02:03'
datetime_2 = '20210321010203'
datetime_3 = '2021/03/21'
datetime_4 = '20210321'
datetime_5 = '2021年3月21日 1時2分'

# 文字列からフォーマットを指定してdatetime型へ変換
convert_datetime_1 = datetime.strptime(datetime_1, '%Y-%m-%d %H:%M:%S')
convert_datetime_2 = datetime.strptime(datetime_2, '%Y%m%d%H%M%S')
convert_datetime_3 = datetime.strptime(datetime_3, '%Y/%m/%d')
convert_datetime_4 = datetime.strptime(datetime_4, '%Y%m%d')
convert_datetime_5 = datetime.strptime(datetime_5, '%Y年%m月%d日 %H時%M分')

# 出力
print(convert_datetime_1)
print(convert_datetime_2)
print(convert_datetime_3)
print(convert_datetime_4)
print(convert_datetime_5)
```

出力結果

```
2021-03-21 01:02:03
2021-03-21 01:02:03
2021-03-21 00:00:00
2021-03-21 00:00:00
2021-03-21 01:02:00
```

# 日付（datetime）から文字列への変換

スマートじゃない書き方

```python
from datetime import datetime

dt = datetime.now()

# 出力
print("{0:%Y-%m-%d %H:%M:%S}".format(dt))
print("{0:%Y年%m月%d日 %H時%M分}".format(dt))
print(str(dt.year  ) + '年')
print(str(dt.year  ) + '年')
print(str(dt.month ) + '月')
print(str(dt.day   ) + '日')
print(str(dt.hour  ) + '時')
print(str(dt.minute) + '分')
print(str(dt.second) + '秒')
print(dt.strftime('%A')) # 曜日（英語）
```
スマートな書き方

イケメンエンジニアがサラリと教えてくれました。@shiracamus さん感謝。
確かにスッキリ。

```python
from datetime import datetime

dt = datetime.now()

# 出力
print(f'{dt:%Y-%m-%d %H:%M:%S}')
print(f'{dt:%Y年%m月%d日 %H時%M分}')
print(f'{dt.year}年')
print(f'{dt.year}年')
print(f'{dt.month}月')
print(f'{dt.day}日')
print(f'{dt.hour}時')
print(f'{dt.minute}分')
print(f'{dt.second}秒')
print(f'{dt:%A}') # 曜日（英語）
```


出力結果

```
2021-03-21 01:01:45
2021年03月21日 01時01分
2021年
2021年
3月
21日
1時
1分
45秒
Sunday
```

# strftime() と strptime() の書式コード
[strftime() と strptime() の書式コード](https://docs.python.org/ja/3/library/datetime.html#strftime-and-strptime-format-codes)

|指定子 |意味 |
|---|---|
|%a |ロケールの曜日名を短縮形で表示します。                                                                                |
|%A |ロケールの曜日名を表示します。                                                                                        |
|%w |曜日を10進表記した文字列を表示します。0 が日曜日で、6 が土曜日を表します。                                            |
|%d |0埋めした10進数で表記した月中の日にち。                                                                               |
|%b |ロケールの月名を短縮形で表示します。                                                                                  |
|%B |ロケールの月名を表示します。                                                                                          |
|%m |0埋めした10進数で表記した月。                                                                                         |
|%y |0埋めした10進数で表記した世紀無しの年。                                                                               |
|%Y |西暦 (4桁) の 10 進表記を表します。                                                                                   |
|%H |0埋めした10進数で表記した時 (24時間表記)。                                                                            |
|%I |0埋めした10進数で表記した時 (12時間表記)。                                                                            |
|%p |ロケールの AM もしくは PM と等価な文字列になります。                                                                  |
|%M |0埋めした10進数で表記した分。                                                                                         |
|%S |0埋めした10進数で表記した秒。                                                                                         |
|%f |10進数で表記したマイクロ秒 (左側から0埋めされます)。                                                                  |
|%z |UTCオフセットを ±HHMM[SS[.ffffff]] の形式で表示します (オブジェクトがnaiveであれば空文字列)。                        |
|%Z |タイムゾーンの名前を表示します (オブジェクトがnaiveであれば空文字列)。                                                |
|%j |0埋めした10進数で表記した年中の日にち。                                                                               |
|%U |0埋めした10進数で表記した年中の週番号 (週の始まりは日曜日とする)。新年の最初の日曜日に先立つ日は 0週に属するとします。|
|%W |0埋めした10進数で表記した年中の週番号 (週の始まりは月曜日とする)。新年の最初の月曜日に先立つ日は 0週に属するとします。|
|%c |ロケールの日時を適切な形式で表します。                                                                                |
|%x |ロケールの日付を適切な形式で表します。                                                                                |
|%X |ロケールの時間を適切な形式で表します。                                                                                |
|%% |文字 '%' を表します。                                                                                                 |

参考リンク
[Documentation » Python 標準ライブラリ » データ型](https://docs.python.org/ja/3/library/datetime.html)