日付の処理に関してまとめる。
awareとnaive
pythonでは同じdatetimeオブジェクトでもaware
なオブジェクトとnaive
なオブジェクトの2種類が存在する。
- aware:タイムゾーン情報を持つdatetimeオブジェクト(オブジェクト生成時にどのタイムゾーンの時刻であるかを指定する必要がある)
- naive:タイムゾーン情報を持たないdatetimeオブジェクト
例えば現在時刻を求めるにはそれぞれ下記のように行う。
from datetime import datetime
import pytz
aware = datetime.now(pytz.utc)
# => 2019-12-18 13:10:11.128125+00:00
naive = datetime.now()
# => 2019-12-18 22:10:11.128095
それぞれが別のオブジェクトであるため日時を比較することはできない。
※変数naiveに値を代入する際に実行されるnow()
はシステム時刻を参照して現在時刻を求めている。
利用可能な日付関連オブジェクト
datetimeモジュールで利用できるオブジェクトは下記のものがある。(公式ドキュメントより抜粋)
object
timedelta
tzinfo
timezone
time
date
datetime
date
は常にnaive
。
time
とdatetime
はaware
かnaive
のどちらかになる。
以降は自分の中でよく使う日付表現を中心に記載する。
現在時刻の取得
import datetime
now = datetime.now()
前日/翌日の日付を取得
ある時点からの経過時間を求めるにはtimedelta
オブジェクトを使用する
from datetime import datetime,timedelta
yesterday = (datetime.now() - timedelta(days=1))
tomorrow = (datetime.now() + timedelta(days=1))
先月/翌月
timedelta
オブジェクトだけで表現できないので、dateutil
ライブラリのrelativedelta
モジュールを使用する。
from datetime import datetime,timedelta
from dateutil.relativedelta import relativedelta
month_before = (datetime.now() - relativedelta(months=1))
month_after = (datetime.now() + relativedelta(months=1))
文字列への変換
日付オブジェクトから文字列を取得するにはstrftime()
を使用する。
日付の形式は公式マニュアルを参照。
from datetime import datetime
now = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
# => 2019/12/18 10:43:06