未能找到此问题的答案。基本上我想做的是这样:
采用日期范围,例如10月10日至11月25日。确定日期范围中十月中多少天和十一月中多少天的最佳算法是什么?
类似这样的东西:
<entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
...Your EF config...
</entityFramework>
我知道这很容易实现,我只是想知道是否有一个非常好的或高效的算法。
谢谢
答案 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之间的所有日期,如果与第三个参数的年和月匹配,则将其作为列表的一部分返回。