3

日付を扱うときに非常に便利な datetime.datetime オブジェクトを見つけましたが、現在、datime.datetime が機能しない状況があります。プログラムの実行中に、日フィールドが動的に計算され、ここに問題があります。

>>> datetime.datetime(2013, 2, 29, 10, 15)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: day is out of range for month

OK、2 月には 29 日はありませんが、datetime がそれを把握してこのオブジェクトを返すことができれば素晴らしいことです

datetime.datetime(2013, 3, 1, 10, 15)

この状況を解決する最善の方法は何ですか? したがって、日の引数が月の日数よりも大きい場合、一般的な解決策を探しています。

4

3 に答える 3

6

Pythonの禅から:明示的は暗黙的よりも優れています。無効な日付を作成しようとするなどのエラーが発生した場合は、その状況を明示的に処理する必要があります。

その例外をどのように処理するかは、完全にアプリケーション次第です。エンドユーザーにエラーを通知するか、日を翌月にシフトするか、その日を当月の最後の法定日に制限することができます。ユースケースに応じて、すべてが有効なオプションになります。

次のコードは、「余剰」日を翌月にシフトします。したがって、2013-02-30は代わりに2013-03-02になります。

import calendar
import datetime

try:
    dt = datetime.datetime(year, month, day, hour, minute)
except ValueError:
    # Oops, invalid date. Assume we can fix this by shifting this to the next month instead
    _, monthdays = calendar.monthrange(year, month)
    if monthdays < day:
        surplus = day - monthdays
        dt = datetime.datetime(year, month, monthdays, hour, minute) + datetime.timedelta(days=surplus)
于 2013-02-28T11:36:02.390 に答える
3

この状況での使用については多くのことが言われていtry...exceptますが、本当に月と日数のオフセットだけが必要な場合は、次のようにすることができます。

d = datetime.datetime(targetYear,targetMonth,1,hour,min,sec)
d = d + datetime.timedelta(days=targetDayOfMonth-1)

基本的に、月の日を常に月の1に設定してから、timedeltaを追加して、現在または将来の月の適切な日付を返します。

d = datetime.datetime(2013, 2, 1, 10, 15) # day of the month is 1
# since the target day is the 29th and that is 28 days after the first
# subtract 1 before creating the timedelta.
d = d + datetime.timedelta(days=28) 
print d
# datetime.datetime(2013, 3, 1, 10, 15)
于 2013-02-28T11:36:37.153 に答える