寻找*现有*Python模块以确定会计月份

寻找*现有*Python模块以确定会计月份,python,calendar,billing,Python,Calendar,Billing,我在日历地狱里,我希望有一个Python模块可以满足我的需求 我正在制作一个处理订阅的Python web应用程序。这在概念上类似于手机计划:你在某个特定日期开始订阅(比如说1.13.2011),每个月你都会有一系列的“会话”(电话),你将为此收取费用 我们需要: 了解每个会话的计费月份 了解每个计费月的开始时间和结束时间 例如,如果您在1.13.2011上注册,并在1.20.2011上打了一个电话,这将取决于您的第一个计费月。2011年10月2日打电话的情况也一样。但是,如果您在2011年2月

我在日历地狱里,我希望有一个Python模块可以满足我的需求

我正在制作一个处理订阅的Python web应用程序。这在概念上类似于手机计划:你在某个特定日期开始订阅(比如说
1.13.2011
),每个月你都会有一系列的“会话”(电话),你将为此收取费用

我们需要:

  • 了解每个会话的计费月份
  • 了解每个计费月的开始时间和结束时间
  • 例如,如果您在
    1.13.2011
    上注册,并在
    1.20.2011
    上打了一个电话,这将取决于您的第一个计费月。2011年10月2日打电话的情况也一样。但是,如果您在2011年2月15日打电话,这将取决于您的第二个计费月

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

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


    我试着编写这个,但它太复杂了。我要找的是一个现成的,现有的模块,可以做这些事情

    看在上帝的份上,不要在回答中附上一个实现的草图 我只对使用处理此类日历任务的现有模块感兴趣你认识一个吗?

    Ram的编辑:
    dateutil.rrule.rrule
    类正是我想要的

    关于开始和结束日期:如果今天是2011年2月15日,则当月的开始日期是2011年2月13日,结束日期是2011年3月13日

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

    它仍然相当基本。使用datetime模块存储日期时间,以便轻松解析日期(例如,如果
    dt
    是日期,则
    dt.day
    )。计费周期从第29天开始(最棘手的情况)。让
    计费周期\u天=29
    。计费事件发生在
    事件日=10,事件月=5
    。然后,从
    事件日
    开始,您向
    事件月
    的账单付款。否则,您将向下一个月的账单支付账单(请记住,如果月份=12,则必须增加年份)

    所以现在的计费周期总是从下个月的29号到28号。如果说2011年2月29日这样的日期不存在,就会出现复杂情况。例如,计费周期开始日期应为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)
    

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


    返回值(开始和结束)允许您确定属于此会计月的日期。但是,如果日期早于开始日期且早于开始日期不到29天,则您也可以在上一个会计月中进行精确定位。下一个财政月也是如此。这很有用,因为在很多情况下,您会在几天后处理数据,因此您将有两个会计月的时间来处理数据。

    不要只发布一个链接作为答案。要么将其作为评论发布,要么解释如何使用该工具解决问题。他要求提供一个可以帮助的模块,我知道这很难看,但链接就是模块,他问:“看在上帝的份上,不要发布带有实现草图的答案!”作为记录,这个答案对我真的很有用。谢谢你!请注意,rrule不能解决2月29日的问题,如果文件中规定的重现日期是31日,则可以延长任何30天:根据RFC第3.3.10节,无效日期和时间的重现实例将被忽略,而不是强制