Pythonの日付・時刻処理

# はじめに
Pythonで日付・時刻の文字列フォーマット変更や、日時差の計算をする方法についてまとめる。日付・時刻処理は```datetime```のライブラリを使う。
　
**ドキュメント**

https://docs.python.org/ja/3/library/datetime.html

# 目次
+ [現在の日付・時刻を取得する](#現在の日付時刻を取得する)
+ [日付・時刻を指定する](#日付時刻を指定する)
+ [日付・時刻を計算する](#日付時刻を計算する)
+ [日付を加算する](#日付を加算する)
+ [datetime→日付・時刻文字列変換](#datetime日付時刻文字列変換)
+ [日付・時刻文字列変換→datetime](#日付時刻文字列変換datetime)

## 現在の日付・時刻を取得する
```datetime.now()```で現在の日付・時刻を取得できる。取得した値からそれぞれ抜き出すこともできる。抜き出しのできるデータは下表の通り。
 パラメータ|抜き出すデータ
 ---|---
 .data()|日付
 .time()|時間
 .year|年
 .month|月
 .day|日
 .hour|時
 .minute|分
 .second|秒
 .microsecond|ms
 
```python:datetime_test.py
from datetime import datetime

td = datetime.now()

print(f'# {type(td)             = } / {td}')
print(f'# {type(td.date())      = } / {td.date()}')
print(f'# {type(td.time())      = } / {td.time()}')
print(f'# {type(td.year)        = } / {td.year}')
print(f'# {type(td.month)       = } / {td.month}')
print(f'# {type(td.day)         = } / {td.day}')
print(f'# {type(td.hour)        = } / {td.hour}')
print(f'# {type(td.minute)      = } / {td.minute}')
print(f'# {type(td.second)      = } / {td.second}')
print(f'# {type(td.microsecond) = } / {td.microsecond}')

# type(td)             = <class 'datetime.datetime'> / 2023-11-24 21:49:09.736613
# type(td.date())      = <class 'datetime.date'> / 2023-11-24
# type(td.time())      = <class 'datetime.time'> / 21:49:09.736613
# type(td.year)        = <class 'int'> / 2023
# type(td.month)       = <class 'int'> / 11
# type(td.day)         = <class 'int'> / 24
# type(td.hour)        = <class 'int'> / 21
# type(td.minute)      = <class 'int'> / 49
# type(td.second)      = <class 'int'> / 9
# type(td.microsecond) = <class 'int'> / 736613
```
[戻る](#目次)

## 日付・時刻を指定する
```datetime()```で任意の日付・時刻を指定することができる。型は```datetime.now()```と同じ<class 'datetime.datetime'>となる。

```python:datetime_test.py
from datetime import datetime
 
#日付まで指定---
td = datetime(2023,11,24)
print(f'# {type(td) = } / {td}')

# type(td) = <class 'datetime.datetime'> / 2023-11-24 00:00:00

#時刻まで指定---
td = datetime(2023,11,24,9,10,15)
print(f'# {type(td) = } / {td}')

# type(td) = <class 'datetime.datetime'> / 2023-11-24 09:10:15

```
[戻る](#目次)

## 日付・時刻を計算する
```datetime```型同士の計算や比較ができる。また計算した結果は下記の通りにすると整数で値を取得できる。

パラメータ|内容
---|---
.days|日差を整数で返す
.seconds|時間差を秒数で返す

```python:datetime_test.py
from datetime import datetime
 
#日付差======================
td1 = datetime(2023,11,24)
td2 = datetime(2023,10,24)
delta = td1 - td2
print(f'# {type(delta) = }/{delta}')
print(f'# {type(delta.days) = }/{delta.days}')

# type(delta) = <class 'datetime.timedelta'>/31 days, 0:00:00
# type(delta.days) = <class 'int'>/31


#時刻デルタ計算=============
td1 = datetime(2023,11,24,10,15,30)
td2 = datetime(2023,11,24,9,10,15)
delta = td1 - td2
print(f'# {type(delta) = }/{delta}')
print(f'# {type(delta.seconds) = }/{delta.seconds}')

# type(delta) = <class 'datetime.timedelta'>/1:05:15
# type(delta.seconds) = <class 'int'>/3915


#日付の比較=================
td1 = datetime(2023,11,24)
td2 = datetime(2023,10,24)
if (td > td2):
	print(f'# td2が日付古い。')
```
[戻る](#目次)

## 日付を加算する
```timedelta()```を使うと、日付の加算ができる。

```python:datetime_test.py
from datetime import timedelta

td = datetime(2023,11,25)

td = td + timedelta(days=5)
print(f'# {type(td) = } / {td}')

# type(td) = <class 'datetime.datetime'> / 2023-11-30 00:00:00

td = td + timedelta(weeks=2)
print(f'# {type(td) = } / {td}')

# type(td) = <class 'datetime.datetime'> / 2023-12-14 00:00:00
```
[戻る](#目次)

## datetime→日付・時刻文字列変換
```datetime```型を日付・時刻文字列へ変換する。変換は```.strftime()```で行う、下記パラメータを使って、文字列フォーマットを指定する。

パラメータ|内容
---|---
%Y|4桁西暦
%y|2桁西暦
%m|2桁月
%d|2桁日
%H|2桁時間
%M|2桁分
%S|2桁秒
%f|6桁ms

```python:datetime_test.py
from datetime import datetime

td = datetime.now()

str_td = td.strftime('%Y/%m/%d %H:%M:%S.%f')
print(f'# {type(str_td) = } / {str_td}')

# type(str_td) = <class 'str'> / 2023/11/24 23:01:00.717843


str_td = td.strftime('%Y-%m-%d %H:%M:%S.%f')
print(f'# {type(str_td) = } / {str_td}')

# type(str_td) = <class 'str'> / 2023-11-24 23:01:00.717843


str_td = td.strftime('%Y%m%d')
print(f'# {type(str_td) = } / {str_td}')

# type(str_td) = <class 'str'> / 20231124


str_td = td.strftime('%y/%m/%d %H:%M:%S.%f')
print(f'# {type(str_td) = } / {str_td}')

# type(str_td) = <class 'str'> / 23/11/24 23:01:00.717843
```
[戻る](#目次)

## 日付・時刻文字列変換→datetime
日付・時刻文字列を```datetime```型へ変換する。変換は```.strptime()```で行う。

```python:datetime_test.py
from datetime import datetime

str_td = '2023-11-24T01:20:12'
ft     = '%Y-%m-%dT%H:%M:%S'
td     = datetime.strptime(str_td, ft)
print(f'# {type(td) = } / {td}')

# type(td) = <class 'datetime.datetime'> / 2023-11-24 01:20:12
```

ISOフォーマット文字列を```datetime```型へ変換する場合は```.fromisoformat()```で行う。

```python:datetime_test.py
from datetime import datetime

# ISOフォーマット文字列→datetime変換----------------------
td = datetime.fromisoformat('2023-11-24T01:20:12+09:00')
print(f'# {type(td) = } / {td}')

# type(td) = <class 'datetime.datetime'> / 2023-11-24 01:20:12+09:00


# ISOフォーマット文字列→datetime→文字列変換---------------
td = datetime.fromisoformat('2023-11-24T01:20:12+09:00')
str_td = td.strftime('%Y/%m/%d')
print(f'# {type(str_td) = } / {str_td}')

# type(str_td) = <class 'str'> / 2023/11/24
```
[戻る](#目次)

以上