1. ホーム
  2. python

[解決済み] 前月の日時オブジェクトを返す

2022-07-09 16:28:02

質問

timedeltaのコンストラクタに月の引数があればいいのですが。 そこで、一番簡単な方法は何でしょうか?

EDITです。 下で指摘されているように、私はこれについてあまり深く考えていませんでした。 最終的には年と月だけを取得するつもりなので、本当に私が欲しかったのは先月の任意の日です。 では、datetime オブジェクトがある場合、最も簡単な方法は何でしょうか。 前月に当たる任意のdatetimeオブジェクト ?

どのように解決するのですか?

これを試してみてください。

def monthdelta(date, delta):
    m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
    if not m: m = 12
    d = min(date.day, [31,
        29 if y%4==0 and (not y%100==0 or y%400 == 0) else 28,
        31,30,31,30,31,31,30,31,30,31][m-1])
    return date.replace(day=d,month=m, year=y)

>>> for m in range(-12, 12):
    print(monthdelta(datetime.now(), m))

    
2009-08-06 16:12:27.823000
2009-09-06 16:12:27.855000
2009-10-06 16:12:27.870000
2009-11-06 16:12:27.870000
2009-12-06 16:12:27.870000
2010-01-06 16:12:27.870000
2010-02-06 16:12:27.870000
2010-03-06 16:12:27.886000
2010-04-06 16:12:27.886000
2010-05-06 16:12:27.886000
2010-06-06 16:12:27.886000
2010-07-06 16:12:27.886000
2010-08-06 16:12:27.901000
2010-09-06 16:12:27.901000
2010-10-06 16:12:27.901000
2010-11-06 16:12:27.901000
2010-12-06 16:12:27.901000
2011-01-06 16:12:27.917000
2011-02-06 16:12:27.917000
2011-03-06 16:12:27.917000
2011-04-06 16:12:27.917000
2011-05-06 16:12:27.917000
2011-06-06 16:12:27.933000
2011-07-06 16:12:27.933000
>>> monthdelta(datetime(2010,3,30), -1)
datetime.datetime(2010, 2, 28, 0, 0)
>>> monthdelta(datetime(2008,3,30), -1)
datetime.datetime(2008, 2, 29, 0, 0)

編集 日にも対応するように修正しました。

Edit のより簡単な計算を指摘した puzzlement の回答も参照してください。 d :

d = min(date.day, calendar.monthrange(y, m)[1])