Windows 10 Pro + Python3 で datetime を色々試してみる

#目的
確認しないといけない日が来るかも？と思いながら、参考サイトを見ながら
色々試してみる
※自分用の確認メモ。
## サンプルコード
PS > python -V
Python 3.7.2

```python
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode

from datetime import datetime, date, time, timedelta
from dateutil.relativedelta import relativedelta
# pip3 install python-dateutil

# 
#   3.xで系でサポートされているバージョンにばらつきがあるので
#   使用前にはDocを確認する
#
```
##現在のローカルな datetime
```python
print(type(datetime.now()))
# <class 'datetime.datetime'>
print(datetime.now())
# 2019-02-09 21:43:18.936348
```
##現在のローカルな日付および時刻を返す
```python
print(type(datetime.today()))
# <class 'datetime.datetime'>
# 書式無しでは print 不可
```
##書式文字列に従った文字列を返す
```python
# date.strftime
# 明示的な書式文字列で制御された、日付を表現する文字列を返す
print(type(datetime.today().strftime('%Y/%m/%d')))
# <class 'str'>
print(datetime.today().strftime('%Y/%m/%d'))
# 2019/02/09
print(datetime.today().strftime('%Y/%m/%d %H:%M:%S'))
# 2019/02/09 21:43:18
# print(datetime.today().strftime('%Z'))
# TODO time-zone
```
##日付の一部を変更する
```python
# date.replace(year=self.year, month=self.month, day=self.day)
# キーワード引数で指定されたパラメータで置き換えられた 
# date オブジェクトを返す
print(type(datetime.today().replace(month=3)))
# <class 'datetime.datetime'>
print(datetime.today().replace(month=3).strftime('%Y/%m/%d'))
# 2019/03/10 : 2月 -> 3月に変更
print(datetime.today().replace(day=1).strftime('%Y/%m/%d'))
# 2019/02/01 : 当月１日に変更
```
##日付を表す文字列 -> datetime に変換する
```python
# datetime.strptime(date_string, format) 
# date_string に対応した datetime を返す
print(type(datetime.strptime('2019/02/09', '%Y/%m/%d')))
# <class 'datetime.datetime'>
print(datetime.strptime('2019/02/09', '%Y/%m/%d'))
# 2019-02-09 00:00:00
print(datetime.strptime('2019/02/09 21:41:28', '%Y/%m/%d %H:%M:%S'))
# 2019-02-09 21:41:28
```
##年月日を数字で取得する
```python
print(type(datetime.today().year))
# <class 'int'>
print(datetime.today().year)    # 2019
print(datetime.today().month)   # 2
print(datetime.today().day)     # 9
```
## 曜日を整数で返す
```python

print(datetime.weekday(datetime.today()))
# 5 : 月曜日を 0、日曜日を 6
print(datetime.isoweekday(datetime.today()))
# 6 : 月曜日を 1、日曜日を 7
```
##キーワード引数で指定された項目に加減算を行う
```python
# datetime.timedelta(days=0, seconds=0, microseconds=0,
# milliseconds=0, minutes=0, hours=0, weeks=0)
# 二つの日付や時刻間の差を表す(分かりづらい・・・)
# 前日
print((datetime.today() - timedelta(days=1)).strftime('%Y/%m/%d'))
# 翌日
print((datetime.today() + timedelta(days=1)).strftime('%Y/%m/%d'))
```
##キーワード引数で指定された項目に加減算を行う
```python
# from dateutil.relativedelta import *
# pip3 install python-dateutil
# The order of attributes considered when this 
# relativedelta is added to a datetime is:
# Year Month Day Hours Minutes Seconds Microseconds

print(type(relativedelta(months=1)))
# <class 'dateutil.relativedelta.relativedelta'>
# 翌日
dt = datetime.today() + relativedelta(days=1)
print(dt.strftime('%Y/%m/%d'))
# 前日
dt = datetime.today() - relativedelta(days=1)
print(dt.strftime('%Y/%m/%d'))

# 当月１日
dt = datetime.today().replace(day=1)
print(dt.strftime('%Y/%m/%d'))      # 2019/02/01
# 次月１日
dt = datetime.today().replace(day=1) + relativedelta(months=1) 
print(dt.strftime('%Y/%m/%d'))      # 2019/03/01
# 当月末日
dt = datetime.today().replace(day=1) + relativedelta(months=1) \
                                     - relativedelta(days=1) 
print(dt.strftime('%Y/%m/%d'))      # 2019/02/28
```
##参考にしたのは以下のサイト
[Pythonで翌日や翌月みたいな日付の計算をする](https://qiita.com/dkugi/items/8c32cc481b365c277ec2)
[datetime --- 基本的な日付型および時間型](https://docs.python.org/ja/3/library/datetime.html)
[strftime() と strptime() の振る舞い](https://docs.python.org/ja/3/library/datetime.html#strftime-strptime-behavior)
[dateutil - powerful extensions to datetime](https://dateutil.readthedocs.io/en/stable/index.html)
[relativedelta - Examples](https://dateutil.readthedocs.io/en/stable/relativedelta.html#examples)