计算今天的日期是否是给定d的重复日期

2024-04-18 13:43:58 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个“开始”日期和频率(每月、每季度、每两年、每年一次),如何计算今天是否是执行所需操作的日期?在

例如,开始日期为2010-01-01,频率为每月。cron作业每天都会运行一个Django管理命令,因此在2010-02-01,应该执行所需的操作(不管是什么,对于这个问题并不重要)。在


Tags: django命令作业cron频率
3条回答

要确定今天是否重复出现,可以使用today in recurring_rule

from datetime import datetime
from dateutil.rrule import rrule, MONTHLY  # $ pip install python-dateutil

starts_at = datetime(2010, 1, 1)
today = datetime(2010, 2, 1) 
interval = {'monthly': 1, 'quarterly': 3,
            'bi-annually': 6, 'annually': 12}[frequency]
if today in rrule(MONTHLY, dtstart=starts_at, interval=interval):
    print('today is a recurring date')

^{}允许您根据RFC 2445创建重复规则。在

如果您只需要支持每月、每季度、每两年、每年一次的简单规则,那么这可能是一种过激行为,但它在更复杂的情况下可能会有用。在

有一个很棒的^{} library有相关的^{} function。这样做的目的是找出今天的日期是否是某个范围的“停止”之一。示例实现:

from datetime import datetime

import delorean
from delorean import stops


def is_it_time(start_date, frequency):
    today = datetime.now()
    today_date = today.date()

    try:
        next(stop for stop in stops(frequency, start=start_date, stop=today)
             if stop.date == today_date)
        return "It's time."
    except StopIteration:
        return "It's not the time."

print is_it_time(datetime(2010, 1, 21), delorean.MONTHLY)  
print is_it_time(datetime(2010, 1, 22), delorean.MONTHLY)

印刷品:

^{pr2}$

注意这里的frequency必须是Delorean频率常量之一,但是,如果需要自定义频率值,只需将它们适当地映射到Delorean常量中。在

这其实比我原来想的要简单。因为所有这些间隔都发生在一个月里,所以计算它非常简单。它使用dateutil中的relativedelta对象。在

from datetime import date
from dateutil.relativedelta import relativedelta

starts_at = date(2010, 1, 1)
today = date(2010, 2, 1)  # as an example
diff = relativedelta(today, starts_at)

if diff.days == 0:  # there must be no days difference between two dates
    if diff.months % 12 == 0:  # this is a year interval
        do_something('annual')
    elif diff.months % 6 == 0:  # this is a six month interval
        do_something('bi_annual')
    elif diff.months % 3 == 0:  # this is a three month interval
        do_something('quarter')
    else:  # this is a month interval
        do_something('month')

相关问题 更多 >