本文共 1846 字,大约阅读时间需要 6 分钟。
QQ交流群:127591054
JackChiang QQ:595696297获取两个日期之间的日期列表如:输入2012-09-21~2013-10-21
得到的结果为:2012-09-21,2012-09-22等等一直到2013-10-21调用get_date_list函数传入一个时间范围列表:如get_date_list([1,’2012-09-21’,’2013-10-21’])
传入参数列表第0个代表状态,0代表日期传入是错误的,1,代表传入一个日期。2、代表传入两个日期,并且第二个日期是大于第一个日期的合法日期。#获取两个日期中间的日期列表def gen_dates(b_date, days): day = timedelta(days=1) for i in range(days): yield b_date + day*idef get_date_list(user_say_date): """ 获取日期列表 :param start: 开始日期 :param end: 结束日期 :return: """ data = [] if user_say_date[0] == 1: data.append(user_say_date[1]) return data elif user_say_date[0] == 2: start = datetime.strptime(user_say_date[1],"%Y-%m-%d").date() end = datetime.strptime(user_say_date[2], "%Y-%m-%d").date() for d in gen_dates(start, (end-start).days): data.append(d) #最后把日期加入 data.append(user_say_date[2]) return data else: data = [] return data
下面这个就可以解释上面的一些疑问,为什么需要状态,我这里对传入日期做了判断,因为用户可以输入一个日期而不是范围。
下面的函数就可以生成一个用户输入的时间列表,并且带有状态。然后列表就会作为上面代码函数的入参。
#日期处理def CurDate(str): #首先判断当前日期是连续的还是单一天数的。 str_Date = re.split(r'~',str) #判断用户输入日期是不是有效日期 flog = 1 try: for i in range(len(str_Date)): datetime.strptime(str_Date[i],"%Y-%m-%d") except: flog = 0 # 代表有两个日期,或者就是只有一个日期 if len(str_Date) > 1 and flog == 1: #判断后面输入的日期是否大于前面的日期,验证用户输入数据是否正确 if datetime.strptime(str_Date[0],"%Y-%m-%d").date() > datetime.strptime(str_Date[1],"%Y-%m-%d").date(): #插入0代表数据错误 str_Date.insert(0,0) return str_Date else: #否则插入2代表有两个日期 str_Date.insert(0,2) return str_Date elif len(str_Date) == 1 and flog == 1: str_Date.insert(0,1) else: str_Date.insert(0,0) return str_Date
测试:
输入一个日期,如下图。测试范围日期,如下图