Discuss / Python / 对日期有判断的正则表达式(包括闰年,大月小月等等)

对日期有判断的正则表达式(包括闰年,大月小月等等)

Topic source
'''练习:
设你获取了用户输入的日期和时间如2015-1-21 9:01:30,以及一个时区信息如UTC+5:00,均是str,请编写一个函数将其转换为timestamp:
1.正则表达式读取日期和时间+时区
2.str->datetime:dt=datetime.strptime('str','%Y-%m-%d %H:%M:%S')
3.强制增加时区dt.replace(tzinfo(timedelta(hours=?)))
'''

#注意对于输入日期的校正:格式-》规则(2月,闰年等等)
'''
3.1.2  根据包含日期不同可划分为四类
Ø  所有年份的所有月份都包含1-28日

Ø  所有年份除2月外都包含29和30日

Ø  所有年份1、3、5、7、8、10、12月都包含31日

Ø  闰年2月包含29日

年份: (?!0000)[0-9]{4}     #正向否定预查
月和日的正则mm-dd:
	1.包括平年在内所有的月份都包括1-28日
		(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
	2.包括平年在内的所有除2月份外都包含29、30
		(0[13-9]|1[0-2])-(29|30)
	3.平年在内的所有年份1、3、5、7、8、10、12月都包含31日
		(0[13578]|1[02])-(31)
	上述合起来——除闰年2月29以外的所有日期
	(?!0000)\d{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-(31))

'''
  
import re		#正则表达式
from datetime import datetime,timezone,timedelta
class DateError(ValueError):
	pass
def TstampTrans(dt):
	if ('-2-30' or '-02-30')  in dt:
		re_d=re.search(r'^(\d{4})(?=-2|02-30)',dt)
		t=int(re_d.group())
		if not(t%4==0 and not t%100!=0 or t%400==0):
			raise DateError('invalid date:%d-2-30'%t)
	else:
		#以下为除闰年的2-30所有的年份
		re_d=re.search(r'^\d{4}-(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2]|[13-9])-(29|30)|(0[13578]|1[02]|[13578])-31',dt)
	re_t=re.search(r'(0[0-9]|1[0-9]|2[0-3]|[0-9]\:[0-5][0-9]\:[0-5][0-9])(?=\s+UTC+)',dt)
	re_tz=re.search(r'(?:UTC\+)(1[0-9]|2[0-3]|[0-9]):00$',dt)
	str_dt=re_d.group()+' '+re_t.group()
	dt=datetime.strptime(str_dt,'%Y-%m-%d %H:%M:%S')
	hs=int(re_tz.group(1))
	#强制设置时区
	utc_dt=dt.replace(tzinfo=timezone(timedelta(hours=hs)))
	#转换ts
	return utc_dt.timestamp()

if __name__=='__main__':
	s=input()
	try:
		print(TstampTrans(s.strip()))
	except DateError as e:
		print(e)

  • 1

Reply