【Python】日付・時間に関するオブジェクト等まとめdate, time, datetime, timedelta, timezone

みなさんこんにちは、ZeroTerasu(@ZeroTerasu)です。

今回は、pythonで使用される日付・時間に関するデータ型、モジュール等についてまとめて記事に致しました。

日付に関する処理は、Pythonのみならず様々なプログラミング言語で必須の処理になりますのでマスターしておく必要があると考えます。

公式ドキュメントは下記リンク先です。

datetime --- 基本的な日付と時間の型
ソースコード: Lib/datetime.py datetime モジュールは、日付や時刻を操作するためのクラスを提供しています。 日付や時刻に対する算術がサポートされている一方、実装では出力のフォーマットや操作のための効率的な属性の抽出に...

データ型

データ型説明属性
date日付に関するデータ型。年、月、日
time時間に関するデータ型。時、分、秒、マイクロ秒、タイムゾーン
datetime日付と時間を組み合わせたデータ型。年、月、日、時、分、秒、マイクロ秒、タイムゾーン
timedeltadate, time, datetimeの時間差マイクロ秒
tzinfoタイムゾーン情報
timezonetzinfoをUTCから差異で表す。

使用するモジュール:datetime

・日付・時間に関するモジュールには、標準ライブラリの「datetime」を使用します。

・標準モジュールですので、install不要です。

・「import datetime」だけでimportすると、以後のコードで「datetime.datetime」と繰り返し記述する必要が生じるため、「from datetime import datetime」とします。

※「import datetime」だけでimportすると、モジュールとしてのdatetimeと認識されてしまい、エラーとなります。

from datetime import datetime

日付を生成:date(year, month, day) or datetime(year, month, day)

・任意の日付オブジェクトの生成には、date() または datetime()メソッドを使用します。

・datetime()メソッドを使用した場合、時、分、秒を省略した際は、それぞれ「0」が代入されます。

from datetime import date, datetime

print(date(2022,8,27))
type(date(2022,8,27))

print(datetime(2022,8,27))
type(datetime(2022,8,27))

# 実行結果
2022-08-25
datetime.date

2022-08-27 00:00:00
datetime.datetime

時間を生成:time(hour, minute, second) or datetime(hour, minute, second)

・任意の時間オブジェクトの生成には、time() または datetime()メソッドを使用します。

・datetime()メソッドを使用する場合、年、月、日は省略できません。それぞれ1以上の整数を引数に渡す必要があります。

from datetime import datetime, date, time

print(time(18,30,30))
print(type(time(18,30,30)))

print(datetime(1900,1,1,18,30,30))
print(type(datetime(1900,1,1,18,30,30)))

# 実行結果
18:30:30
<class 'datetime.time'>

1900-01-01 18:30:30
<class 'datetime.datetime'>

現在時刻のオブジェクトを生成:datetime.now()

・現在の日時を生成するには、datetime.now()メソッドを使用します。

print(datetime.now())
type(datetime.now())
# 実行結果
2022-08-27 18:22:45.216843
datetime.datetime

日付と時間の合成:datetime.combine(date, time)

・combine()にdateオブジェクトおよびtimeオブジェクトを渡すことでdatetimeオブジェクトとして結合することが出来ます。

from datetime import date, time, datetime
tarday = date(2022,8,27)
tartime = time(11,30,30)
tardate = datetime.combine(tarday, tartime)
print(tardate)
# 実行結果
2022-08-27 11:30:30
<class 'datetime.datetime'>

datetime → date

・datetimeオブジェクトは、dateオブジェクトとtimeオブジェクトの両方を内包したオブジェクトです。

・datetimeオブジェクトからdateオブジェクトの部分だけを切り取るためには、datetime.date()を使用します。

import datetime
NOW = datetime.datetime.now()
TODAY = datetime.datetime.now().date()

# 実行結果
datetime.datetime(2022, 8, 27, 9, 1, 16, 94514) # NOWの実行結果
datetime.date(2022, 12, 25) # TODAYの実行結果

日付の計算(前日・翌日の生成方法)

・timedeltaオブジェクトを使って二つの日付の差分を加算または減算します。

 ・timedelta(days=1)で1日分の差分を表すことが出来ます。

 ・timedeltaオブジェクトの引数には、seconds, minutes, hoursのような引数も用意されています。

import datetime
TODAY = datetime.datetime.now.date()
YESTERDAY = TODAY - datetime.timedelta(days=1)
TOMORROW = TODAY + datetime.timedelta(days=1)

# 実行結果
datetime.date(2022, 8, 27) # TODAY の実行結果です。
datetime.date(2022, 8, 26) # YESTERDAY の実行結果です。
datetime.date(2022, 8, 28) # TOMORROW の実行結果です。

文字列->datetime変換:datetime.strptime(‘日付文字列’, ‘フォーマット文字’)

・文字列→datetime変換には、strptime()メソッドを使用します。

・引数に変換対象の文字列を渡します。この文字列の表記に合わせるようにフォーマット文字を指定します。

・フォーマット文字に使用される書式指定子には、下記のものがあります。

24時間表記の日付文字列の変換
from datetime import date, time, datetime
tardate = datetime.strptime("2022/8/25 12:30:30", "%Y/%m/%d %H:%M:%S")
print(tardate)
print(type(tardate))
# 実行結果
2022-08-25 12:30:30
<class 'datetime.datetime'>
AM・PM表記の日付文字列の変換
from datetime import date, time, datetime
tardate = datetime.strptime("2022/8/25 AM06:30:30", "%Y/%m/%d %p%I:%M:%S")
print(tardate)
print(type(tardate))
# 実行結果
2022-08-25 12:30:30
<class 'datetime.datetime'>
指定子意味使用例
%a曜日名 短縮形Sun, Mon, …, Sat
%A曜日名Sunday, Monday, …, Saturday
%w曜日の10進表記した文字列を表示。0 :日曜日、6 :土曜日。0, 1, …, 6
%d0埋め10進数表記の日にち。01, 02, …, 31
%b月名 短縮形Jan, Feb, …, Dec
%B月名January, February, …, December
%m0埋め10進数月。01, 02, …, 12
%y0埋め10進数年。短縮形00, 01, …, 99
%H0埋めした10進数で表記した時 (24時間表記)。00, 01, …, 23
%I0埋めした10進数で表記した時 (12時間表記)。01, 02, …, 12
%pAM もしくは PMAM, PM
%M0埋め10進数表記の分。00, 01, …, 59
%S0埋め10進数表記の秒。00, 01, …, 59

タイムゾーンを日本時間に設定

ローカル環境ではJSTが適用されますが、本番環境では日本時間以外のタイムゾーンが設定されていることもあります。そこで、タイムゾーンを明示的にJSTに設定する方法を解説します。

import datetime
JST = datetime.timezone(datetime.timedelta(hours=9), 'JST')
JST_TODAY = datetime.datetime.now(JST).date().strftime('%Y年%m月%d日')
JST_TODAY

# 実行結果
'2022年8月27日'

コメント

タイトルとURLをコピーしました