获取日期范围内特定月份中的天数

时间:2018-10-31 17:30:33

标签: python algorithm

未能找到此问题的答案。基本上我想做的是这样:

采用日期范围,例如10月10日至11月25日。确定日期范围中十月中多少天和十一月中多少天的最佳算法是什么?

类似这样的东西:

<entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
    ...Your EF config...
</entityFramework>

我知道这很容易实现,我只是想知道是否有一个非常好的或高效的算法。

谢谢

4 个答案:

答案 0 :(得分:1)

从该答案How do I divide a date range into months in Python? 中借用算法,这可能会起作用。输入为date格式,但可以根据需要将其更改为日期字符串:

import datetime
begin = '2018-10-10'
end = '2018-11-25'

dt_start = datetime.datetime.strptime(begin, '%Y-%m-%d')
dt_end = datetime.datetime.strptime(end, '%Y-%m-%d')
one_day = datetime.timedelta(1)
start_dates = [dt_start]
end_dates = []
today = dt_start
while today <= dt_end:
    #print(today)
    tomorrow = today + one_day
    if tomorrow.month != today.month:
        start_dates.append(tomorrow)
        end_dates.append(today)
    today = tomorrow

end_dates.append(dt_end)

out_fmt = '%d %B %Y'
for start, end in zip(start_dates,end_dates):
    diff = (end - start).days
    print('{} to {}: {} days'.format(start.strftime(out_fmt), end.strftime(out_fmt), diff))

结果:

10 October 2018 to 31 October 2018: 21 days
01 November 2018 to 25 November 2018: 24 days

答案 1 :(得分:1)

上述问题可能没有唯一的答案。例如,您应该从daysInMonthFromDaterange('Feb 15 - Mar 15', 'February')得到什么?那将取决于年份!

但是,如果您用实际天数代替,我建议使用月的第一天到下个月的第一天作为日期的定义,从日期转换为整数天。现在将其减少为整数的相交间隔,这更加容易。

一个月第一天总是发生的假设处理的是不同长度的月份,可变长度的月份,甚至可以正确处理从儒略历向公历的转换的传统位置。参见cal 1752。 (不过,它不会处理所有位置的切换。如果您要处理的图书馆建有1919年的罗马尼亚日期,您可能会遇到问题...)

答案 2 :(得分:0)

您可以使用datetime模块:

from datetime import datetime

start = datetime(2018,10,10)
end = datetime(2018,11,25)
print((end - start).days)

答案 3 :(得分:0)

类似的事情会起作用:

def daysInMonthFromDaterange(date1, date2, month):
    return [x for x in range(date1.toordinal(), date2.toordinal()) if datetime.date.fromordinal(x).year == month.year and datetime.date.fromordinal(x).month == month.month]

print(len(days_in_month(date(2018,10,10), date(2018,11,25), date(2018,10,01))))

这只会循环遍历date1和date2之间的所有日期,如果与第三个参数的年和月匹配,则将其作为列表的一部分返回。