5

django で datetime Python モジュールを使用しています。有効期限が現在の日付から6か月以内の場合、日付を計算しようとしています。

現在の日付から 6 か月後の日付を生成する理由は、そのイベントが発生したフィールド/列を強調表示するアラートを設定するためです。私の質問が明確かどうかわかりません。私はtimedelta関数について読んでいますが、本当に理解できません。この条件を満足させるために if 文を書こうとしています。誰でも私を助けることができますか?django と python の初心者です。

4

4 に答える 4

10

2 つのアプローチがあります。1 つはわずかに不正確で、もう 1 つは別の方法で不正確です。

  • datetime.timedelta()365.25 / 2 日 (平均年の長さを 2 で割った値)の a を追加します。

      import datetime
      sixmonths = datetime.datetime.now() + datetime.timedelta(days=365.25/2)
    

    このメソッドは、6 か月先の日時スタンプを提供します。ここで、6 か月は正確に半年 (平均) と定義されます。

  • 外部dateutilライブラリrelativedeltaを使用してください。これには、カレンダーの計算に基づいて現在の日付に 6 か月を追加する優れたクラスがあります。

      import datetime
      from dateutil.relativedelat import relativedelta
      sixmonths = datetime.datetime.now() + relativedelta(months=6)
    

    このメソッドは、日付の月コンポーネントが 6 だけ進められた 6 か月先の日時スタンプを提供し、月の境界を考慮して、それらを超えないようにします。たとえば、8 月 30 日と 6 か月を足すと、2 月 28 日または 29 日になります (閏年が許せば)。

デモンストレーションが役立つ場合があります。私のタイムゾーンでは、投稿時点で、これは次のように変換されます。

>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 2, 18, 12, 16, 0, 547567)
>>> now + datetime.timedelta(days=365.25/2)
datetime.datetime(2013, 8, 20, 3, 16, 0, 547567)
>>> now + relativedelta(months=6)
datetime.datetime(2013, 8, 18, 12, 16, 0, 547567)

したがって、2 つの方法には 1 日と 15 時間の違いがあります。

同じメソッドがオブジェクトでもうまく機能しdatetime.dateます:

>>> today = datetime.date.today()
>>> today
datetime.date(2013, 2, 18)
>>> today + datetime.timedelta(days=365.25/2)
datetime.date(2013, 8, 19)
>>> today + relativedelta(months=6)
datetime.date(2013, 8, 18)

半年の timedelta は、日付のみに適用されると、かなり精度が低下します (現在、デルタの 5/8 日コンポーネントは無視されます)。

于 2013-02-18T11:06:52.957 に答える
2

「6か月」が180日を意味する場合、次を使用できます。

import datetime
d = datetime.date.today()
d + datetime.timedelta(6 * 30)

または、カレンダーで実際の 6 か月を意味する場合は、カレンダー モジュールを検索し、各月でいくつかの検索を行う必要があります。例えば:

import datetime
import calendar

def add_6_months(a_date):
    month = a_date.month - 1 + 6
    year = a_date.year + month / 12
    month = month % 12 + 1
    day = min(a_date.day,calendar.monthrange(year, month)[1])
    return datetime.date(year, month, day)
于 2013-02-18T11:02:15.233 に答える
0

私はデロリアンに真剣な表情を与えるでしょう。それは上に構築されてdateutilおりpytz、あなたが求めたことを実行するには、次のようになります。

>>> d =  Delorean()
>>> d
Delorean(datetime=2013-02-21 06:00:21.195025+00:00, timezone=UTC)
>>> d.next_month(6)
Delorean(datetime=2013-08-21 06:00:21.195025+00:00, timezone=UTC)

これは、すべてのdateutil計算を考慮に入れるだけでなく、タイムゾーンシフトの提供とインターフェイスを行います。.datetimeデロリアンオブジェクトで必要な日時を簡単に取得します。

于 2013-02-21T06:03:06.850 に答える
-1

特定の日付を戻したい場合、これはうまくいくかもしれません:

from calendar import datetime

datetime.date(2019,1,1).strftime("%a %d")
#The arguments here are: year, month, day and the method is there to return a formated kind of date - in this case - day of the week and day of the month.

結果は次のようになります: 火 01

それが役に立てば幸い!

于 2018-07-20T17:39:59.130 に答える