3

私はカレンダー地獄にいます。私が望むことを実行する Python モジュールがそこに存在することを願っています。

サブスクリプションを扱う Python Web アプリを作成しています。概念的には、携帯電話のプランに似ています。特定の日付 (たとえば1.13.2011) にサブスクリプションを開始すると、請求月ごとに多数の「セッション」 (通話) が発生し、料金が請求されます。

必要がある:

  1. 各セッションがどの請求月に該当するかを把握します。
  2. 各請求月の開始時刻と終了時刻を把握します。

たとえば、 にサインアップし1.13.2011、 に電話をかけた1.20.2011場合、最初の請求月にカウントされます。での電話も同じです2.10.2011。ただし、 に電話をかけた場合は2.15.2011、2 番目の請求月にカウントされます。

開始日と終了日について: 今日が2.15.2011の場合、今月の開始日は2.13.2011で、終了日は3.13.2011です。

これはそれほど複雑ではないと思うかもしれませんが、月にはさまざまな長さがあることを考慮する必要があります。これを処理するためのルールは、サブスクリプションが任意の月の 30 日に開始された場合、各月の締め切り日はmin(30, n_days_in_that_month). これは 29、30、31 にも当てはまります。


これをコーディングしようとしましたが、複雑すぎました。私が探しているのは、これらのことを行う既製の既存のモジュールです。

神への愛のために、実装のスケッチで答えを投稿しないでください! これは私には役に立たない。私はあなたの意図に感謝しますが、カレンダー地獄では、実装のスケッチは役に立ちません. 私はすでに実装のスケッチを持っており、あなたのデバッグは私のデバッグと同じくらい時間がかかります。

このようなカレンダー タスクを処理する既存のモジュールを使用することにのみ関心があります。1つ知っていますか?

4

3 に答える 3

6

http://labix.org/python-dateutil

Ram の編集: このdateutil.rrule.rruleクラスは、私が望んでいたことを正確に実行したクラスです。

于 2011-11-03T18:40:27.943 に答える
2

開始日と終了日について: 今日が 2011 年 2 月 15 日の場合、当月の開始日は 2011 年 2 月 13 日で、終了日は 2011 年 3 月 13 日です。

これはそれほど複雑ではないと思うかもしれませんが、月にはさまざまな長さがあることを考慮する必要があります。これを処理するための規則は、サブスクリプションが任意の月の 30 日に開始された場合、各月の締め切り日は min(30, n_days_in_that_month) になるということです。これは 29、30、31 にも当てはまります。

それはまだかなり基本的です。datetime モジュールを使用して日時を保存すると、その日を簡単に解析できます (たとえば、 if dtis a date then dt.day)。請求サイクルは、たとえば 29 日に始まります (最も厳しいタイプのケース)。しましょうbilling_cycle_day=29。請求可能なイベントが で発生しますevent_day=10, event_month=5。次に、event_day < billing_cycle_dayさんevent_monthの請求書に請求します。それ以外の場合は、次の月の請求書に請求します (月 = 12 の場合、年をインクリメントする必要があることに注意してください)。

そのため、請求サイクルは常に翌月の 29 日から 28 日になります。2011 年 2 月 29 日のような日付が存在しない場合、複雑さが生じます。たとえば、請求サイクルの start_date は 2011 年 2 月 29 日である必要があります (ただし、存在しません)。この場合、翌月の最初にするだけです。

billing_cycle_day = 29
year, month = 2011, 2
import datetime
def create_date_or_first_of_next_month(year, month, day):
    try:
        return datetime.date(year, month, day)
    except ValueError:
        year_n, month_n = (year, month+1) if month != 12 else (year+1, 1)
        return datetime.date(year_n, month_n, 1)
于 2011-11-03T19:04:26.440 に答える
1

この問題はあなたが思っているほど難しくありません。開始日 (13 日や 30 日など) を指定すると、現在の会計月の開始日と終了日の 2 つの日付オブジェクトを返す関数を作成するだけです。質問のすべての詳細をすでにスケッチしています。オプションの todayis パラメータを関数に含めて、今日の参照として使用する日を指定することをお勧めします。たとえば、今日が 2011 年 10 月 15 日で 13 を指定すると、関数は 2011 年 10 月 13 日を意味すると想定します。ただし、6 月のデータを再実行する場合は、todayis=date(2011,06, 13)

戻り値 (開始と終了) により、この会計月に属する日付を特定できます。ただし、日付が開始日より前で、開始日から 29 日以内の場合は、前会計月を特定することもできます。翌会計月も同様です。数日後にデータを処理する状況が多くなり、2 つの会計月が混在して処理されるため、これは便利です。

于 2011-11-03T20:01:12.837 に答える