経緯
Lambdaで処理年月日時を取得する際につまづいたので記述する。
datetimeモジュールのオブジェクト
- datetime :日付と時刻を扱う
- date:日付を扱う
- time:時刻を扱う
- timedelta:時間差を扱う
間違った例 1
Python
from datetime import datetime
# 処理年月日を取得
processingDate = datetime.datetime.today()
# エラー文
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
そもそも
- from --- import ~~~文を理解してなかった
- モジュールとオブジェクトの概念もよくわかってなかった
ため適当に書いてた(笑)
※from datetime import datetimeと書いたら メソッドの先頭は省略できる。(むしろ省略しないと怒られる)
正)
Python
from datetime import datetime
processingDate = datetime.today()
# 出力
2022-10-31 22:09:50.533899
※Lambdaの場合、これだけだとUTC時間(日本時間から-9時間された値)が取得されてしまう。
間違った例 2
lambdaで時刻を扱う場合、実行環境(UTC)に引っ張られるため日本時間を扱いたい際は必ず timezoneオブジェクト(tzinfoのサブクラス)を用いる。
Python
from datetime import datetime, timezone, timedelta
# 日本時間を設定
TZ_JST = timezone(timedelta(hours=+9))
# datetime.todayの引数にtzinfoを渡してやれば取得できる と思っていたが…
processingDate = datetime.today(TZ_JST)
# エラー文
TypeError: datetime.today() takes no arguments (1 given)
エラー文からも読み取れる通り、公式にも ↓
datetime.today()
このメソッドの機能は now() と等価ですが、tz 引数はありません。
引数にいれたらいけるやろという安直な考えではダメだった…
調べてみると Aware オブジェクト と Naive オブジェクト なる概念が存在するらしいが
ここではそこまで書く気力がないので割愛する。
最終的な処理
結局、いろいろ苦戦しながらも調べていたら下記の処理方法に落ち着いた。
Python
from datetime import datetime, timedelta
processingDate = datetime.today() + timedelta(hours=9)
# 出力
2022-11-01 08:54:11.720274
無理やり、取得した日時にtimedeltaオブジェクトで9時間足している。
まあ、やりたいことはできたからおk。