|
#!/usr/bin/python# -*- coding: utf-8 -*-#countDays.py# version 0.10 edited by lingyue.wkl 20110819 11:00:00# version 0.11 modified by lingyue.wkl 20110820 11:37:00 add functions for days list#this script count days,between two date or one date and the days between them#考虑下,很多方法可以抽象出来,进一步优化,先期先实现功能吧#下一个版本 改进所有函数,优化之,抽象之import time,getopt,sys,datetimedef date_to_str(in_date):return str(in_date)[:10]#计算两个日期之间相隔天数def get_count_between_two_date(begin_date,end_date):b_date = begin_date.split("-")b_date = [int(num) for num in b_date]b_date_time = datetime.datetime(b_date[0],b_date[1],b_date[2])e_date = end_date.split("-")e_date = [int(num) for num in e_date]e_date_time = datetime.datetime(e_date[0],e_date[1],e_date[2])return (e_date_time - b_date_time).days#计算某个日期前n天是哪一天 默认日期是今天def get_n_days_before_or_after_oneday(n_days,in_date=str(datetime.date.today())[:10]):begin_date = in_date.split("-")begin_date = [int(num) for num in begin_date]return str(datetime.datetime(begin_date[0],begin_date[1],begin_date[2]) + datetime.timedelta(days=n_days))[:10]def get_year():return str(datetime.date.today())[:4]def get_month():return str(datetime.date.today())[5:7]def get_day():return str(datetime.date.today())[8:]def get_now():return datetime.datetime.now()def get_today():return datetime.date.today()def get_yesterday():return get_n_days_before_or_after_oneday(-1,str(datetime.date.today())[:10])def get_tomorrow():return get_n_days_before_or_after_oneday(1,str(datetime.date.today())[:10])#两个日期之间 n天的日期列表def get_n_daystimes_list_of_two_date(begin_date,end_date):b_date = begin_date.split("-")b_date = [int(num) for num in b_date]b_date_time = datetime.datetime(b_date[0],b_date[1],b_date[2])e_date = end_date.split("-")e_date = [int(num) for num in e_date]e_date_time = datetime.datetime(e_date[0],e_date[1],e_date[2])days = (e_date_time - b_date_time).daysn_days_list = []for i in range(0,days+1):n_days_list.append(str(b_date_time + datetime.timedelta(days=i)))return n_days_listdef get_n_days_list_of_two_date(begin_date,end_date):return [str(day)[:10] for day in get_n_daystimes_list_of_two_date(begin_date,end_date)]def get_n_dayswiththreetimes_list_of_two_date(begin_date,end_date):days = get_n_days_list_of_two_date(begin_date,end_date)days_three_time_list = []for day in days:for i in range(0,3):if i == 0:days_three_time_list.append(day+" 00:00:00")elif i == 1:days_three_time_list.append(day+" 12:00:00")else:days_three_time_list.append(day+" 23:59:59")return days_three_time_list#某个日期之前n天 所有日期列表def get_n_daystimes_list_before_or_after_one_day(n_days,end_date=str(datetime.date.today())[:10]):begin_date = get_n_days_before_or_after_oneday(n_days,end_date)return get_n_daystimes_list_of_two_date(begin_date,end_date)def get_n_days_list_before_or_after_one_day(n_days,end_date=str(datetime.date.today())[:10]):begin_date = get_n_days_before_or_after_oneday(n_days,end_date)return get_n_days_list_of_two_date(begin_date,end_date)def get_n_dayswiththreetimes_list_before_or_after_one_day(n_days,end_date=str(datetime.date.today())[:10]):begin_date = get_n_days_before_or_after_oneday(n_days,end_date)return get_n_dayswiththreetimes_list_of_two_date(begin_date,end_date)def help_msg():print("功能:日期相关操作")print("选项:")print("\t 默认,无选项,输出当天日期,格式2011-08-20")print("\t -y [可选,输出当前年份]")print("\t -m [可选,输出当前月份]")print("\t -d [可选,输出当前日]")print("\t -n +-数字 [可选,计算当前日期前后多少天的日期,数字为负表示往前]")print("\t -f 2011-10-22[可选,指定坐标日期,即以指定日期开始计算,若不指定,坐标日期为当天]")print("\t -t 2011-10-25 [可选,目标日期,可用于计算两个日期相隔天数]")print("\t -l [1|2|3] [可选,是否列表,若选定,输出日期间的所有序列,1 2 3 代表三种不同格式]")sys.exit(0)def print_list(l):for i in l:print(i)#print(get_year())#print(get_month())#print(get_day())#print(get_now())#print(get_today())#print(get_yesterday())#print(get_tomorrow())#print(get_n_days_before_or_after_oneday(2,"2011-08-20"))#print(get_n_daystimes_list_of_two_date("2011-08-01","2011-08-05"))#print(get_n_days_list_of_two_date("2011-08-01","2011-08-05"))#print(get_n_dayswiththreetimes_list_of_two_date("2011-08-01","2011-08-05")) #print(get_n_daystimes_list_before_or_after_ond_day(-5,"2011-08-20"))#print(get_n_days_list_before_or_after_ond_day(-5,"2011-08-20"))#print(get_n_dayswiththreetimes_list_before_or_after_ond_day(-5,"2011-08-20"))#程序入口,读入参数,执行def main():is_list = Falsetry:opts,args = getopt.getopt(sys.argv[1:],"n:f:t:o:ymdhrl:")if len(opts) == 0:print(get_today())sys.exit(0)for op,value in opts:if op in ("-h","-H","--help"):help_msg()if op == "-y":print(get_year())sys.exit(0)elif op == "-m":print(get_month())sys.exit(0)elif op == "-d":print(get_day())sys.exit(0)elif op == "-n":n_days = int(value)elif op == "-f":from_date = valueelif op == "-t":to_date = valueelif op == "-l":is_list = Truelist_type = valueexcept getopt.GetoptError:print(sys.argv[0]+" : params are not defined well!")#if "n_days" not in dir() and "from_date" not in dir() and "to_date" not in dir():# print(result_str)if "n_days" in dir() and "from_date" not in dir() and "to_date" not in dir():if not is_list:print(get_n_days_before_or_after_today(n_days))else:if list_type == "1":result_list = get_n_days_list_before_or_after_one_day(n_days)elif list_type == "2":result_list = get_n_daystimes_list_before_or_after_one_day(n_days)elif list_type == "3":result_list = get_n_dayswiththreetimes_list_before_or_after_one_day(n_days)print_list(result_list)if "n_days" in dir() and "from_date" in dir() and "to_date" not in dir():if not is_list:print(get_n_days_before_or_after_oneday(n_days,from_date))else:if list_type == "1":result_list = get_n_days_list_before_or_after_one_day(n_days,from_date)elif list_type == "2":result_list = get_n_daystimes_list_before_or_after_one_day(n_days,from_date)elif list_type == "3":result_list = get_n_dayswiththreetimes_list_before_or_after_one_day(n_days,from_date)print_list(result_list)if "n_days" not in dir() and "from_date" in dir() and "to_date" in dir():if not is_list:print(get_count_between_two_date(from_date,to_date))else:if list_type == "1":result_list = get_n_days_list_of_two_date(from_date,to_date)elif list_type == "2":result_list = get_n_daystimes_list_of_two_date(from_date,to_date)elif list_type == "3":result_list = get_n_dayswiththreetimes_list_of_two_date(from_date,to_date)print_list(result_list)main()
最近需要做一些日期的操作,写了一个脚本
|
|