Pythonにて日付と時刻を扱う方法

年月日Pythonについての投稿もかなりのボリュームになりました。まだまだつたないところは多々ありますが、学習というところですので、懲りずに投稿させていただきます。

今回は、日付と時刻を重点的にやっていきたいと思います。まずは一つ目。
```py
from datetime import datetime

d = datetime(2021, 10, 12, 12, 1, 5)
print(d.year)
print(d.month)
print(d.day)
print(d.hour)
print(d.minute)
print(d.second)
```
実行結果
2021
10
12
12
1
5

datetime型を生成する場合、引数に日付時間を指定します。年月日以外はキーワード引数で一部だけを指定することも可能です。生成したdatetime型は、属性を指定して日付や時間を参照することが可能です。上記のコードでは、2021年10月12日12時1分5秒のdatetime型を生成し、それぞれの値を取得しています。

次に参ります

```pメソッドy
from datetime import datetime

# 文字列からdatetime型を生成
dt = datetime.strptime("2021/10/12 12:05:00", "%Y/%m/%d %H:%M:%S")

# datetime型から文字列に変換
datetime_str = dt.strftime("%Y-%m-%d %H:%M:%S")
print(datetime_str)
```

実行結果
2021-10-12 12:05:00

フォーマットされた文字列とdatetime型は相互に変換することができます。datetimeのstrptimeメソッドで、文字列からdatetimeへ変換することができます。逆にdatetime型から文字列への変換は、strftimeメソッドを使用します。引数にフォーマット文字列を指定します。上記のコードでは、2021/10/12:05:00という文字列を実行結果date型に変換し、2021-10-12 12:05:00という文字列にprint出力しています。

次に参ります。

```py
from datetime import datetime

# 現在時刻を取得
dt = datetime.now()

# datetime型から文字列に変換
datetime_str = dt.strftime("%Y-%m-%d %H:%M:%S")
print(datetime_str)
```
実行結果
2023-08-31 13:22:05

現在時刻の取得方法です。datetime.now()で現在時刻を取得できます。上記のコードでは、現在時刻から%Y-%m-%d %H:%M:%S形式に変換してprint出力しています。

次に参ります

```py
from datetime import date

d = date(2021, 10, 12)
print(d.year)
print(d.month)
print(d.day)
```

実行結果
2021
10
12


date型を生成する場合、date()の引数に年月日を指定します。生成したdate型は属性を指定して日付を参照することが可能です。上記のコードでは、2021年10月12日ん０おdate型を生成しそれぞれの値を取得しています。

次に参ります。

```py
from datetime import date, datetime

# 文字列からdatetime型さらにdate型に変換
d = datetime.strptime("2021/10/12", "%Y/%m/%d").date()

# date型から文字列に変換
date_str = d.strftime("%Y-%m-%d")
print(date_str)
```

実行結果
2021-10-12

文字列からdateへ変換する場合、date型にはdatetimeのstrptimeメソッドに相当するものがないため、datetimeオブジェクトをいったん生成してからdateに変換します。一方、dateから文字列に変換する場合は、datetime型と同様strftimeメソッドを使用します。引数にフォーマット文字列を指定します。2021/10/12という文字列をdate型に変換し、2021-10-12という文字列に出力しています。

次に参ります。

```py
from datetime import datetime, date

d = date.today()
d_str = d.strftime("%Y-%m-%d")
print(d_str)
```

実行結果
2023-08-31

todayメソッドで現在のdate型を得ることができます。上記のコードでは現在のdate型を生成し、%Y-%m-%d形式でprint出力しています。

date
次に参ります。

```py
from datetime import datetime, date, time, timedelta

# 2021/12/22のdate型を生成
d1 = date(2021, 12, 22)

# 2021/12/22 12:00:30のdatetime型を生成
dt1 = datetime(2021, 12, 22, 12, 00, 30)

# 100日分のtimedelta型を生成
delta = timedelta(days=100)

# 100日後の日付を計算
d2 = d1 + delta
dt2 = dt1 + delta

# 計算結果をprint出力
print(d2)
print(dt2)
```

実行結果
2022-04-01
2022-04-01 12:00:30

timedelta()の引数に加減する日数を指定することで日付の計算を行うことができます。手順としては、timedelta型を生成し、計算したいdate日時time型やdate型に対して演算を行います。上記のコードではdatetime、date型に対しそれぞれの100日後の日付を計算し、print出力しています。

次に参ります。

```py
from datetime import datetime, date, time, timedelta

# 2021/12/22のdate型を生成
d1 = date(2021, 12, 22)

# 2021/12/22 12:00:30のdatetime型を生成
dt1 = datetime(2021, 12, 22, 12, 00, 30)

# 100日分のtimedelta型を生成
delta = timedelta(days=100)

# 100日前の日付を計算
d2 = d1 - delta
dt2 = dt1 - delta

# 計算結果をprint出力
print(d2)
print(dt2)
```

実行結果
2021-09-13
2021-09-13 12:00:30

マイナスで演算するとさかのぼった日時を得ることができます。実際、前記のコードの日付計算部分を上記のようにすると、100日前の日付を得ることができます。

次に参ります。

```py
from datetime import time

t = time(12, 15, 5)
print(t.hour)
print(t.minute)
print(t.second)
```


実行結果
12
15
5

time型を生成する場合、引数に時分秒を指定します。また、生成したtime型の時分秒にアクセスすることも可能です。上記のコードは12:15:05のtime型を生成し、時分秒を取得しています。

次に参ります。、

```py
from datetime import time, datetime

t = datetime.strptime("12:15:05", "%H:%M:%S").time()
time_str = t.strftime("%H.%M.%S")
print(time_str)
```

実行結果
12.15.05

文字列から、timeへの変換は、datetimeのstrptimeメソッドに相当するものがないため、datetimeオブジェクトをいったん生成してから、timeに変換します。一方、timeから文字列への変換はstrftimeメソッドを使用します。引数にフォーマット文字列を指定します。上記のコードでは、12:15:05という文字列をtime型に変換し、12.15.05という文字列に変換してprint出力しています。

次に参ります。

```py
import calendar

start_wd, end_day = calendar.monthrange(2020, 2)
print(start_wd, end_day)
```

実行結果
5 29

業務処理で頭を悩ませがちなのが、日付の処理の月末判定です。月初と異なり月末やうるう年などにより日が異なるのですが、標準ライブラリのcalendarモジュールを使用すると、指定した月の月初曜日と月末日をタプで得ることが可能です。上記のコードは2020年2月の月末を取得しています。

次に参ります。

```py
import calendar
from datetime import datetime

now_dt = datetime.now()
result = calendar.isleap(now_dt.year)
print(result)
```

実行結果
False

calendarモジュールのisleapを使用すると、うるう年の判定をすることができます。上記のコードでは現在がうるう年かどうかを判定しています。実行するときによって結果は変わりますが、うるう年に実行するとTrueが、そうでないときはFalseが出力されます。