寻找*现有的* Python模块来确定财政月份

时间:2011-11-03 18:37:37

标签: python calendar billing

我在日历地狱,我希望有一个Python模块可以做我想要的。

我正在制作一个处理订阅的Python网络应用程序。它在概念上类似于手机计划:您在特定日期开始订阅(例如1.13.2011),并且对于每个结算月份,您有一堆“会话”(电话),您需要付费

我们需要:

  1. 了解每个会话落在哪个结算月份。
  2. 了解每个结算月的开始时间和结束时间。
  3. 例如,如果您在1.13.2011上注册,并通过1.20.2011拨打电话,则会计入您的第一个结算月份。对于2.10.2011上的电话也是如此。但是,如果您要通过2.15.2011拨打电话,则会计入您的第二个结算月份。

    关于开始日期和结束日期:如果今天为2.15.2011,则当前月份的开始日期为2.13.2011,其结束日期为3.13.2011

    你可能认为这不是那么复杂,但是你必须考虑几个月有不同的长度。处理此问题的规则是,如果您的订阅在任何月份的30日开始,则每个月的截止日期为min(30, n_days_in_that_month)。这也适用于29,30和31。


    我尝试编码,但它太复杂了。我正在寻找的是一个现成的,现有的模块来做这些事情。

    对于上帝的爱,不要用实施草图发表答案!这对我来说毫无用处。我很感激你的意图,但在日历中,实施的草图并没有帮助。我已经有了一个实现的草图,调试你的实现只需要调试我的。

    我只对使用处理此类日历任务的现有模块感兴趣。 你知道吗?

3 个答案:

答案 0 :(得分:5)

http://labix.org/python-dateutil

Ram的编辑:dateutil.rrule.rrule类是完全我想要的那个。

答案 1 :(得分:2)

  

关于开始和结束日期:如果今天是2.15.2011,那么当月的开始日期是2.13.2011,其结束日期是3.13.2011。

     

你可能认为这不是那么复杂,但是你必须考虑几个月有不同的长度。处理此问题的规则是,如果您的订阅在任何月份的30日开始,则其每月的截止日期将为min(30,n_days_in_that_month)。这也适用于29,30和31。

它仍然非常基本。使用datetime模块存储日期时间,这样您就可以轻松地解析当天(例如,dt是一个日期,然后是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应该是2/29/2011(但它不存在);在这种情况下,你只需将它作为下个月的第一个。

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)

答案 2 :(得分:1)

这个问题并不像你想象的那么难。您所要做的就是编写一个给定开始日(如13或30)的函数,它返回两个日期对象,它们是当前会计月的开始和结束。您已经勾勒出问题中的所有细节。最好在函数中包含一个可选的todayis参数,以便指定当天用作参考的日期。例如,如果今天是2011年10月15日,并且您指定了13,那么该函数将假设您的意思是2011年10月13日。但是如果您想重新运行June数据,则应指定todayis = date(2011,06, 13)

返回值(开始和结束)允许您精确定位属于此会计月份的日期。但如果日期在开始日期之前且在开始日期之前不到29天,那么您还可以精确定位上一个会计月份。下个财政月也是如此。这很有用,因为在很多情况下,您会在几天后处理数据,因此您将需要两个会计月的混合处理。