我需要检查这两个日期,而不是名单上的任何日期范围。
我想知道can用户签入日期(check_range_true - can,check_range_false -不能)或这个已经预订的日期(date_ranges中)
我的射程看上去像:
date_ranges = [
['2020-1-12', '2020-1-13'],
['2020-1-14', '2020-1-15'],
['2020-1-15', '2020-1-16'],
['2020-1-16', '2020-1-18'],
['2020-1-18', '2020-1-19'],
['2020-1-21', '2020-1-23'],
['2020-1-23', '2020-1-27'],
['2020-1-30', '2020-2-1'],
['2020-2-5', '2020-2-7'],
['2020-2-7', '2020-2-9'],
['2020-2-9', '2020-2-11'],
['2020-2-14', '2020-2-18'],
['2020-2-20', '2020-2-26'],
['2020-3-26', '2020-3-30'],
['2020-5-29', '2020-5-30'],
['2020-10-10', '2021-1-15']
]和两个日期(例如)
check_range_true = ['2020-02-02', '2020-02-04']
check_range_false = ['2020-02-02', '2020-02-05']我知道如何在范围内检查一个日期,但不知道如何用两个日期来解决它。
在一个范围内检查这些日期并得到结果的最佳方法是什么,第一个变量的True (因为2020-02-02,2020-02-04没有“触摸”范围)和第二个变量的False (因为2020-02-05的范围是'2020-2-5','2020-2-7')?
发布于 2020-01-14 18:24:06
您要做的是使用(start < first_date < end)和(start < end_date < end)逻辑检查日期。
date_ranges = [
['2020-1-12', '2020-1-13'],
['2020-1-14', '2020-1-15'],
['2020-1-15', '2020-1-16'],
['2020-1-16', '2020-1-18'],
['2020-1-18', '2020-1-19'],
['2020-1-21', '2020-1-23'],
['2020-1-23', '2020-1-27'],
['2020-1-30', '2020-2-1'],
['2020-2-5', '2020-2-7'],
['2020-2-7', '2020-2-9'],
['2020-2-9', '2020-2-11'],
['2020-2-14', '2020-2-18'],
['2020-2-20', '2020-2-26'],
['2020-3-26', '2020-3-30'],
['2020-5-29', '2020-5-30'],
['2020-10-10', '2021-1-15']
]
#convert to a flat list
date_ranges = [k for i in date_ranges for k in i]
#truncate the start and the end value
date_ranges = date_ranges[1:-1]
#convert values to datetime
import datetime
date_ranges = [datetime.datetime.strptime(i, '%Y-%m-%d') for i in date_ranges]
#create available time slots
date_ranges = [[date_ranges[i],date_ranges[i+1]] for i in range(0,len(date_ranges),2)]
#convert the check date to date time
check_range = ['2020-02-02', '2020-02-04']
check_range = [datetime.datetime.strptime(i, '%Y-%m-%d') for i in check_range]
# apply the logic of start < date < end twice
any([(i[0] < check_range[0] < i[1]) and (i[0] < check_range[1] < i[1]) for i in date_ranges])
True
check_range = ['2020-02-02', '2020-02-05']
check_range = [datetime.datetime.strptime(i, '%Y-%m-%d') for i in check_range]
any([(i[0] < check_range[0] < i[1]) and (i[0] < check_range[1] < i[1]) for i in date_ranges])
False发布于 2020-01-14 22:43:43
如果我正确理解这一点,您希望检查给定的日期范围(例如,check_range_true)是否与列表中指定的任何其他日期范围重叠(或不重叠)。为了实现这一点,我首先将字符串值转换为适当的datetime对象,以便更容易地进行日期比较。这可以通过列表理解和strptime来实现。
from datetime import datetime
booked_date_ranges = [
[datetime.strptime(start_date, '%Y-%m-%d'), datetime.strptime(end_date, '%Y-%m-%d')]
for start_date, end_date in date_ranges
]然后我将创建一个函数,它将检查提供的日期范围(包括开始日期和结束日期)是否与以前指定的列表中的任何日期范围重叠。您需要检查开始日期是在日期范围之间还是结束日期在日期范围之间。这将是一种类似于这样的东西:
def dates_overlap(date_range_to_check, booked_date_ranges):
dates = [datetime.strptime(date, '%Y-%m-%d') for date in date_range_to_check]
return any(
(start_date <= dates[0] and dates[0] <= end_date) or (start_date <= dates[1] and dates[1] <= end_date)
for start_date, end_date in booked_date_ranges
)然后,如果要检查给定的日期范围是否重叠,只需使用dates_overlap函数并否定结果:
>>> not dates_overlap(check_range_false, booked_date_ranges)
False
>>> not dates_overlap(check_range_true, booked_date_ranges)
True我希望这能回答你的问题。当然,这只是一个草案,肯定有一些改进的空间,但应该是一个工作的解决方案,给出的问题。
https://stackoverflow.com/questions/59739044
复制相似问题