python实现时间的加减,类似linux的date命令
内容如题
原因:solaris等os不能做时间的运算处理,个人爱好。之前用c实现了一版,这里再次用python实现一版,后期应该还有改进版
改进:1 代码优化
2 添加了指定获取月份最后一天的功能
第四版:
添加了-d选项,-d date date_format,既可以指定时间字符串和时间格式,格式可以不指定默认为 %Y%m%d或%Y-%m-%d
第五版:
1 修进了一些bug
2 把入口函数添加到类中,方便其他python的调用,而不是单纯的脚本
第六版:
在类中使用了初始化函数,方便调用,可以在初始化函数中直接设置需要输入的参数,而不必对内部变量作出设置
第七版:
修改了-d参数从对时间戳的支持,例:-d "1526606217" "%s"
第八版:
修正版了部分代码,减少代码行数。
代码核心:
核心函数
datetime.datetime.replace()
calendar.monthrange()
datetime.timedelta()
核心思想:
不指定-l参数,不获取计算后月份天数的最大值,既不获取月份最后一天
月份加减主要是考虑当前日期天对比计算后的月份最大日期,如果大于计算后的日期天数,则在月份数+1,在日期天数上面替换为当前日期天数减去计算后的月份天数。例如:当前:2018-01-31,月份+1的话是2月,但是2月没有31号,所以计算和的结果为2018-03-03,既月份+1为3,日期为31-28为3。
指定-l参数和不指定-l参数的不同点,在于月份的计算,指定-l参数则不会计算当前日期大于计算后的日期天数再次对月份和日期计算。例如,2018-01-31,不指定-l,月份+1,则结果会是2018-03-03,指定-l的结果则是2018-02-28。指定-l则是单纯的在月份+1.
脚本下载地址:https://github.com/raysuen/rdate
#!/usr/bin/envpython#_*_coding:utf-8_*_#Authbyraysuen#versionv8.0importdatetimeimporttimeimportcalendarimportsysimportre#时间计算的类classDateColculation(object):rdate={"time_tuple":time.localtime(),"time_format":"%Y-%m-%d%H:%M:%S%A","colculation_string":None,"last_day":False,"input_time":None,"input_format":None}def__init__(self,time_tuple=None,out_format=None,col_string=None,isLastday=None,in_time=None,in_format=None):iftime_tuple!=None:self.rdate["time_tuple"]=time_tupleifout_format!=None:self.rdate["time_format"]=out_formatifcol_string!=None:self.rdate["colculation_string"]=col_stringifisLastday!=None:self.rdate["last_day"]=isLastdayifin_time!=None:self.rdate["input_time"]=in_timeifin_format!=None:self.rdate["input_format"]=in_format#月计算的具体实现函数def__R_MonthAdd(self,col_num,add_minus,lastday,time_truct):R_MA_num=0#记录计算的月的数字R_ret_tuple=None#返回值,None或者时间元组R_MA_datetime=None#临时使用的datetime类型iftype(col_num)!=int:#判断传入的参数是否为数字print("theparametertypeiswrong!")exit(5)iftime_truct==None:R_MA_datetime=datetime.datetime.now()#获取当前时间else:R_MA_datetime=datetime.datetime.fromtimestamp(time.mktime(time_truct))ifadd_minus.lower()=="add":#判断是否为+R_MA_num=R_MA_datetime.month+col_numifR_MA_num>12:#判断相加后的月份数是否大于12,如果大于12,需要在年+1whileR_MA_num>12:R_MA_datetime=R_MA_datetime.replace(year=R_MA_datetime.year+1)R_MA_num=R_MA_num-12R_ret_tuple=self.__days_add(R_MA_datetime,R_MA_num,lastday).timetuple()else:R_ret_tuple=self.__days_add(R_MA_datetime,R_MA_num,lastday).timetuple()elifadd_minus.lower()=="minus":#判断是否为-whilecol_num>=12:#判断传入的参数是否大于12,如果大于12则对年做处理R_MA_datetime=R_MA_datetime.replace(year=R_MA_datetime.year-1)col_num=col_num-12#R_MA_num=12+(R_MA_datetime.month-col_num)#获取将要替换的月份的数字ifR_MA_datetime.month-col_num<0:#判断当前月份数字是否大于传入参数(取模后的),小于0表示,年需要减1,并对月份做处理ifR_MA_datetime.day>calendar.monthrange(R_MA_datetime.year-1,R_MA_datetime.month)[1]:#如果年减一后,当前日期的天数大于年减一后的天数,则在月份加1,天变更为当前日期天数减变更后的月份天数R_MA_datetime=R_MA_datetime.replace(year=R_MA_datetime.year-1,month=R_MA_datetime.month+1,day=(R_MA_datetime.day>calendar.monthrange(R_MA_datetime.year-1,R_MA_datetime.month)[1]))#年减1else:R_MA_datetime=R_MA_datetime.replace(year=R_MA_datetime.year-1)#年减1R_MA_datetime=self.__days_add(R_MA_datetime,12-abs(R_MA_datetime.month-col_num),lastday)elifR_MA_datetime.month-col_num==0:#判断当前月份数字是否等于传入参数(取模后的),等于0表示,年减1,月份替换为12,天数不变(12月为31天,不可能会存在比31大的天数)R_MA_datetime=R_MA_datetime.replace(year=R_MA_datetime.year-1,month=12)elifR_MA_datetime.month-col_num>0:#默认表示当前月份-传入参数(需要减去的月数字)大于0,不需要处理年R_MA_datetime=self.__days_add(R_MA_datetime,R_MA_datetime.month-col_num,lastday)R_ret_tuple=R_MA_datetime.timetuple()returnR_ret_tuple#返回时间元组def__days_add(self,formal_MA_datetime,formal_MA_num,lastday):R_MA_datetime=formal_MA_datetimeR_MA_num=formal_MA_numiflastday:#如果计算月最后一天,则直接把月份替换,天数为月份替换后的最后一天R_MA_datetime=R_MA_datetime.replace(month=R_MA_num,day=calendar.monthrange(R_MA_datetime.year,R_MA_num)[1])#月份替换,天数为替换月的最后一天else:ifR_MA_datetime.day>\calendar.monthrange(R_MA_datetime.year,R_MA_num)[1]:#判断当前日期的天数是否大于替换后的月份天数,如果大于,月份在替换后的基础上再加1,天数替换为当前月份天数减替换月份天数R_MA_datetime=R_MA_datetime.replace(month=R_MA_num+1,day=R_MA_datetime.day-calendar.monthrange(R_MA_datetime.year,R_MA_num)[1])#月份在替换月的数字上再加1,天数替换为当前月份天数减替换月份天数else:R_MA_datetime=R_MA_datetime.replace(month=R_MA_num)#获取替换月份,day不变returnR_MA_datetime#月计算的入口函数defR_Month_Colculation(self,R_ColStr,lastday,time_truct):R_ret_tuple=NoneifR_ColStr.find("-")!=-1:#判断-是否存在字符串col_num=R_ColStr.split("-")[-1].strip()#获取需要计算的数字ifcol_num.strip().isdigit():#判断获取的数字是否为正整数R_ret_tuple=self.__R_MonthAdd(int(col_num.strip()),"minus",lastday,time_truct)#获取tupletime时间格式else:#如果获取的数字不为正整数,则退出程序print("Pleaseenterrightformatsymbol!!")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(4)elifR_ColStr.find("+")!=-1:#判断+是否存在字符串col_num=R_ColStr.split("+")[-1].strip()#获取需要计算的数字ifcol_num.strip().isdigit():#判断获取的数字是否为正整数R_ret_tuple=self.__R_MonthAdd(int(col_num.strip()),"add",lastday,time_truct)#获取tupletime时间格式else:print("Pleaseenterrightformatsymbol!!")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(4)returnR_ret_tuple#秒,分,时,日,周计算的实现函数defR_General_Colculation(self,R_ColStr,time_truct,cal_parm):R_ret_tuple=Noneiftime_truct==None:#判断是否指定了输入时间,没指定则获取当前时间,否则使用指定的输入时间R_Datatime=datetime.datetime.now()else:R_Datatime=datetime.datetime.fromtimestamp(time.mktime(time_truct))ifR_ColStr.find("-")!=-1:#判断-是否存在字符串col_num=R_ColStr.split("-")[-1].strip()#获取需要计算的数字ifcol_num.strip().isdigit():#判断获取的数字是否为正整数ifR_ColStr.strip().lower().find("second")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(seconds=-int(col_num.strip()))).timetuple()#获取tupletime时间格式elifR_ColStr.strip().lower().find("minute")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(minutes=-int(col_num.strip()))).timetuple()#获取tupletime时间格式elifR_ColStr.strip().lower().find("hour")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(hours=-int(col_num.strip()))).timetuple()#获取tupletime时间格式elifR_ColStr.strip().lower().find("day")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(days=-int(col_num.strip()))).timetuple()#获取tupletime时间格式elifR_ColStr.strip().lower().find("week")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(weeks=-int(col_num.strip()))).timetuple()#获取tupletime时间格式#R_ret_tuple=(R_Datatime+datetime.timedelta(cal_parm=-int(col_num.strip()))).timetuple()#获取tupletime时间格式else:#如果获取的数字不为正整数,则退出程序print("Pleaseenterrightformatsymbol!!")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(4)elifR_ColStr.find("+")!=-1:#判断+是否存在字符串col_num=R_ColStr.split("+")[-1].strip()#获取需要计算的数字ifcol_num.strip().isdigit():#判断获取的数字是否为正整数ifR_ColStr.strip().lower().find("second")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(seconds=int(col_num.strip()))).timetuple()#获取tupletime时间格式elifR_ColStr.strip().lower().find("minute")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(minutes=int(col_num.strip()))).timetuple()#获取tupletime时间格式elifR_ColStr.strip().lower().find("hour")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(hours=int(col_num.strip()))).timetuple()#获取tupletime时间格式elifR_ColStr.strip().lower().find("day")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(days=int(col_num.strip()))).timetuple()#获取tupletime时间格式elifR_ColStr.strip().lower().find("week")!=-1:R_ret_tuple=(R_Datatime+datetime.timedelta(weeks=int(col_num.strip()))).timetuple()#获取tupletime时间格式else:print("Pleaseenterrightformatsymbol!!")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(4)returnR_ret_tuple#年计算的实现函数defR_Year_Colculation(self,R_ColStr,time_truct):R_ret_tuple=Noneiftime_truct==None:#判断是否指定了输入时间,没指定则获取当前时间,否则使用指定的输入时间R_Y_Datatime=datetime.datetime.now()else:R_Y_Datatime=datetime.datetime.fromtimestamp(time.mktime(time_truct))ifR_ColStr.find("-")!=-1:#判断-是否存在字符串col_num=R_ColStr.split("-")[-1].strip()#获取需要计算的数字ifcol_num.strip().isdigit():#判断获取的数字是否为正整数#判断当前时间是否为闰年并且为二月29日,如果是相加/减后不为闰年则在月份加1,日期加1ifcalendar.isleap(R_Y_Datatime.year)andR_Y_Datatime.month==2andR_Y_Datatime.day==29andcalendar.isleap(R_Y_Datatime.year-int(col_num.strip()))==False:R_ret_tuple=(R_Y_Datatime.replace(year=R_Y_Datatime.year-int(col_num.strip()),month=R_Y_Datatime.month+1,day=1)).timetuple()#获取tupletime时间格式else:R_ret_tuple=(R_Y_Datatime.replace(year=R_Y_Datatime.year-int(col_num.strip()))).timetuple()#获取tupletime时间格式else:#如果获取的数字不为正整数,则退出程序print("Pleaseenterrightformatsymbol!!")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(4)elifR_ColStr.find("+")!=-1:#判断+是否存在字符串col_num=R_ColStr.split("+")[-1].strip()#获取需要计算的数字ifcol_num.strip().isdigit():#判断获取的数字是否为正整数#判断当前时间是否为闰年并且为二月29日,如果是相加/减后不为闰年则在月份加1,日期加1ifcalendar.isleap(R_Y_Datatime.year)andR_Y_Datatime.month==2andR_Y_Datatime.day==29andcalendar.isleap(R_Y_Datatime.year+col_num.strip())==False:R_ret_tuple=(R_Y_Datatime.replace(year=R_Y_Datatime.year-int(col_num.strip()),month=R_Y_Datatime.month+1,day=1)).timetuple()#获取tupletime时间格式else:R_ret_tuple=(R_Y_Datatime.replace(year=R_Y_Datatime.year+int(col_num.strip()))).timetuple()#获取tupletime时间格式else:print("Pleaseenterrightformatsymbol!!")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(4)returnR_ret_tuple#获取月的最后一天defR_Month_lastday(self,time_tuple):R_MA_datetime=datetime.datetime.fromtimestamp(time.mktime(time_tuple))#time_tupleR_MA_datetime=R_MA_datetime.replace(day=(calendar.monthrange(R_MA_datetime.year,R_MA_datetime.month)[1]))returnR_MA_datetime.timetuple()defR_colculation(self):ret_tupletime=NoneColStr=self.rdate["colculation_string"]lastday=self.rdate["last_day"]input_time=NoneifColStr!=None:iftype(ColStr)!=str:print("Pleaseenterrightformatsymbol!!")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(3)if(ColStr.find("-")!=-1)and(ColStr.find("+")!=-1):print("Pleaseenterrightformatsymbol!!")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(3)ifself.rdate["input_time"]!=None:ifself.rdate["input_format"]==None:i=1while1:try:ifi<2:input_time=time.strptime(self.rdate["input_time"],"%Y%m%d")else:input_time=time.strptime(self.rdate["input_time"],"%Y-%m-%d")breakexceptValueErrorase:ifi<2:i+=1continueprint("Theinputtimeandformatdonotmatch.")exit(98)elifself.rdate["input_format"]=="%s":ifself.rdate["input_time"].isdigit():input_time=time.localtime(int(self.rdate["input_time"]))else:print("Theinputtimemustbenumber.")exit(97)else:try:input_time=time.strptime(self.rdate["input_time"],self.rdate["input_format"])exceptValueErrorase:print("Theinputtimeandformatdonotmatch.")exit(98)iflastday:ifColStr==None:ifinput_time!=None:ret_tupletime=self.R_Month_lastday(input_time)else:ret_tupletime=self.R_Month_lastday(time.localtime())#second的计算#elifColStr.strip().lower().find("second")!=-1:#判断是否传入的字符串中是否存在hour关键字#ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"seconds")##minute的计算#elifColStr.strip().lower().find("minute")!=-1:#判断是否传入的字符串中是否存在hour关键字##ret_tupletime=self.R_Minute_Colculation(ColStr.strip().lower(),input_time)#ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"minutes")##hour的计算#elifColStr.strip().lower().find("hour")!=-1:#判断是否传入的字符串中是否存在hour关键字##ret_tupletime=self.R_Hour_Colculation(ColStr.strip().lower(),input_time)#ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"hours")##day的计算#elifColStr.strip().lower().find("day")!=-1:#判断是否传入的字符串中是否存在day关键字##ret_tupletime=self.R_Month_lastday(self.R_Day_Colculation(ColStr.strip().lower(),input_time))#ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"days")##week的计算#elifColStr.strip().lower().find("week")!=-1:#判断是否传入的字符串中是否存在day关键字##ret_tupletime=self.R_Month_lastday(self.R_Week_Colculation(ColStr.strip().lower(),input_time))#ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"weeks")elifColStr.strip().lower().find("second")!=-1orColStr.strip().lower().find("minute")!=-1orColStr.strip().lower().find("hour")!=-1orColStr.strip().lower().find("day")!=-1orColStr.strip().lower().find("week")!=-1:ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time)#month的计算elifColStr.strip().lower().find("month")!=-1:#判断是否传入的字符串中是否存在day关键字ret_tupletime=self.R_Month_lastday(self.R_Month_Colculation(ColStr.strip().lower(),lastday,input_time))#year的计算elifColStr.strip().lower().find("year")!=-1:#判断是否传入的字符串中是否存在day关键字ret_tupletime=self.R_Month_lastday(self.R_Year_Colculation(ColStr.strip().lower(),input_time))else:print("Pleaseenterrightformatsymbolof-c.")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(3)else:ifColStr==None:ifself.rdate["input_time"]!=None:ret_tupletime=input_timeelse:ret_tupletime=time.localtime()#second的计算elifColStr.strip().lower().find("second")!=-1:#判断是否传入的字符串中是否存在hour关键字ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"seconds")#minute的计算elifColStr.strip().lower().find("minute")!=-1:#判断是否传入的字符串中是否存在hour关键字#ret_tupletime=self.R_Minute_Colculation(ColStr.strip().lower(),input_time)ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"minutes")#hour的计算elifColStr.strip().lower().find("hour")!=-1:#判断是否传入的字符串中是否存在hour关键字#ret_tupletime=self.R_Hour_Colculation(ColStr.strip().lower(),input_time)ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"hours")#day的计算elifColStr.strip().lower().find("day")!=-1:#判断是否传入的字符串中是否存在day关键字#ret_tupletime=self.R_Month_lastday(self.R_Day_Colculation(ColStr.strip().lower(),input_time))ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"days")#week的计算elifColStr.strip().lower().find("week")!=-1:#判断是否传入的字符串中是否存在day关键字#ret_tupletime=self.R_Month_lastday(self.R_Week_Colculation(ColStr.strip().lower(),input_time))ret_tupletime=self.R_General_Colculation(ColStr.strip().lower(),input_time,"weeks")#month的计算elifColStr.strip().lower().find("month")!=-1:#判断是否传入的字符串中是否存在day关键字ret_tupletime=self.R_Month_Colculation(ColStr.strip().lower(),lastday,input_time)#year的计算elifColStr.strip().lower().find("year")!=-1:#判断是否传入的字符串中是否存在day关键字ret_tupletime=self.R_Year_Colculation(ColStr.strip().lower(),input_time)else:print("Pleaseenterrightformatsymbolof-c.")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(3)returnret_tupletimedeffunc_help():print("""NAME:rdate--displaydateandtimeSYNOPSIS:rdate[-f][timeformat][-c][colculationformat][-d][input_time][input_time_format]DESCRIPTION:-c:valueishour/day/week/month/year,plus+/-,plusanumberwhichisnumbertocolculate-l:obtainanumberwhichislastdayofmonth-d:input_time:enteratimestringinput_time_format:enteratimeformatforinputtime,default%Y%m%dor%Y-%m-%d-f:%Aisreplacedbynationalrepresentationofthefullweekdayname.%aisreplacedbynationalrepresentationoftheabbreviatedweekdayname.%Bisreplacedbynationalrepresentationofthefullmonthname.%bisreplacedbynationalrepresentationoftheabbreviatedmonthname.%Cisreplacedby(year/100)asdecimalnumber;singledigitsareprecededbyazero.%cisreplacedbynationalrepresentationoftimeanddate.%Disequivalentto``%m/%d/%y''.%disreplacedbythedayofthemonthasadecimalnumber(01-31).%E*%O*POSIXlocaleextensions.Thesequences%Ec%EC%Ex%EX%Ey%EY%Od%Oe%OH%OI%Om%OM%OS%Ou%OU%OV%Ow%OW%Oyaresupposedtoprovidealternaterepresentations.Additionally%OBimplementedtorepresentalternativemonthsnames(usedstandalone,withoutdaymentioned).%eisreplacedbythedayofthemonthasadecimalnumber(1-31);singledigitsareprecededbyablank.%Fisequivalentto``%Y-%m-%d''.%Gisreplacedbyayearasadecimalnumberwithcentury.Thisyearistheonethatcontainsthegreaterpartoftheweek(Mondayasthefirstdayoftheweek).%gisreplacedbythesameyearasin``%G'',butasadecimalnumberwithoutcentury(00-99).%Hisreplacedbythehour(24-hourclock)asadecimalnumber(00-23).%hthesameas%b.%Iisreplacedbythehour(12-hourclock)asadecimalnumber(01-12).%jisreplacedbythedayoftheyearasadecimalnumber(001-366).%kisreplacedbythehour(24-hourclock)asadecimalnumber(0-23);singledigitsareprecededbyablank.%lisreplacedbythehour(12-hourclock)asadecimalnumber(1-12);singledigitsareprecededbyablank.%Misreplacedbytheminuteasadecimalnumber(00-59).%misreplacedbythemonthasadecimalnumber(01-12).%nisreplacedbyanewline.%O*thesameas%E*.%pisreplacedbynationalrepresentationofeitherantemeridiem(a.m.)orpostmeridiem(p.m.)asappropriate.%Risequivalentto``%H:%M''.%risequivalentto``%I:%M:%S%p''.%Sisreplacedbythesecondasadecimalnumber(00-60).%sisreplacedbythenumberofsecondssincetheEpoch,UTC(seemktime(3)).%Tisequivalentto``%H:%M:%S''.%tisreplacedbyatab.%Uisreplacedbytheweeknumberoftheyear(Sundayasthefirstdayoftheweek)asadecimalnumber(00-53).%uisreplacedbytheweekday(Mondayasthefirstdayoftheweek)asadecimalnumber(1-7).%Visreplacedbytheweeknumberoftheyear(Mondayasthefirstdayoftheweek)asadecimalnumber(01-53).IftheweekcontainingJanuary1hasfourormoredaysinthenewyear,thenitisweek1;otherwiseitisthelastweekofthepreviousyear,andthenextweekisweek1.%visequivalentto``%e-%b-%Y''.%Wisreplacedbytheweeknumberoftheyear(Mondayasthefirstdayoftheweek)asadecimalnumber(00-53).%wisreplacedbytheweekday(Sundayasthefirstdayoftheweek)asadecimalnumber(0-6).%Xisreplacedbynationalrepresentationofthetime.%xisreplacedbynationalrepresentationofthedate.%Yisreplacedbytheyearwithcenturyasadecimalnumber.%yisreplacedbytheyearwithoutcenturyasadecimalnumber(00-99).%Zisreplacedbythetimezonename.%zisreplacedbythetimezoneoffsetfromUTC;aleadingplussignstandsforeastofUTC,aminussignforwestofUTC,hoursandminutesfollowwithtwodigitseachandnodelimiterbetweenthem(commonformforRFC822dateheaders).%+isreplacedbynationalrepresentationofthedateandtime(theformatissimilartothatproducedbydate(1)).%-*GNUlibcextension.Donotdoanypaddingwhenperformingnumericaloutputs.%_*GNUlibcextension.Explicitlyspecifyspaceforpadding.%0*GNUlibcextension.Explicitlyspecifyzeroforpadding.%%isreplacedby`%'.EXAMPLE:rdate--2017-10-2311:04:51Mondayrdate-f"%Y-%m_%d"--2017-10-23rdate-f"%Y-%m_%d"-c"day-3"--2017-10-20rdate-f"%Y-%m_%d"-c"day+3"--2017-10-26rdate-f"%Y-%m_%d"-c"month+3"--2017-7-23rdate-f"%Y-%m_%d"-c"year+3"--2020-7-23rdate-c"week-1"-f"%Y-%m-%d%V"--2018-02-1507rdate-c"day-30"-f"%Y-%m-%d"-l--2018-01-31rdate-d"1972-01-31""%Y-%m-%d"--1972-01-3100:00:00Monday""")if__name__=="__main__":d1=DateColculation()iflen(sys.argv)>1:i=1whilei<len(sys.argv):ifsys.argv[i]=="-h":#判断输入的参数是否为-h,既获取帮助func_help()exit(0)elifsys.argv[i]=="-f":#-f表示format,表示指定的输出时间格式i=i+1ifi>=len(sys.argv):#判断-f的值的下标是否大于等于参数个数,如果为真则表示没有指定-f的值print("Thevalueof-fmustbespecified!!!")exit(1)elifsys.argv[i]=="-c":print("Thevalueof-fmustbespecified!!!")exit(1)elifre.match("^-",sys.argv[i])!=None:#判断-f的值,如果-f的下个参数以-开头,表示没有指定-f值print("Thevalueof-fmustbespecified!!!")exit(1)d1.rdate["time_format"]=sys.argv[i]#获取输出时间格式elifsys.argv[i]=="-c":#-c表示colculation,计算i=i+1ifi>=len(sys.argv):#判断-f的值的下标是否大于等于参数个数,如果为真则表示没有指定-f的值print("Thevalueof-cmustbespecified!!!")exit(2)elifsys.argv[i]=="-f":print("Thevalueof-cmustbespecified!!!")exit(2)elif(re.match("^-",sys.argv[i])!=None):#判断-f的值,如果-f的下个参数以-开头,表示没有指定-f值print("Thevalueof-cmustbespecified!!!")exit(2)d1.rdate["colculation_string"]=sys.argv[i]#获取需要计算的字符串参数内容elifsys.argv[i]=="-d":#-ddate表示指定输入的时间和输入的时间格式i+=1ifi>=len(sys.argv):#判断-d的值的下标是否大于等于参数个数,如果为真则表示没有指定-的值print("Thevalueof-dmustbespecified!!!")exit(3)elif(re.match("^-",sys.argv[i])!=None):#判断-d的值,如果-df的下个参数以-开头,表示没有指定-df值print("Thevalueof-cmustbespecified!!!")exit(3)d1.rdate["input_time"]=sys.argv[i]if(i+1<len(sys.argv)andre.match("^-",sys.argv[(i+1)])==None):d1.rdate["input_format"]=sys.argv[i+1]i+=1elifsys.argv[i]=="-l":#-l表示获取月份的最后一天d1.rdate["last_day"]=Trueelse:print("Youmustenterrightparametr.")print("Ifyoudon'tkownwhatvaluesisavalable,pleaseuse-htogethelp!")exit(3)i=i+1d1.rdate["time_tuple"]=d1.R_colculation()#获取时间的元组,通过R_colculation函数,R_colculation参数为传入一个需要计算的时间字符串print(time.strftime(d1.rdate["time_format"],d1.rdate["time_tuple"]))exit(0)else:#如果不输入参数,则输出默认格式化的本地时间print(time.strftime(d1.rdate["time_format"],d1.rdate["time_tuple"]))exit(0)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。