'''练习: 设你获取了用户输入的日期和时间如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)
Sign in to make a reply
叫红烧排骨把