zoukankan      html  css  js  c++  java
  • Python实践——datetime日期操作脚本

    #!/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,datetime
    
    def 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).days
      n_days_list = []
      for i in range(0,days+1):
        n_days_list.append(str(b_date_time + datetime.timedelta(days=i)))
      return n_days_list
    
    def 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 = False
        try:
            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 = value
              elif op == "-t":
                to_date = value
              elif op == "-l":
                is_list = True
                list_type = value
    
        except 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()
    

    最近需要做一些日期的操作,写了一个脚本



    Meet so Meet. C plusplus I-PLUS....
  • 相关阅读:
    老外写的js闭包
    List<Object> 转为 List<MyClass>
    html 自定义属性
    js 中的算术运算
    System.Web.Mvc.Html 命名空间小计
    历时半年,发布最完整的代码生成器CodeBuilder最新版本
    CodeBuilder之Template接口
    CodeBuilder之Tool接口
    FaibClass.Data
    轻量的Json序列化
  • 原文地址:https://www.cnblogs.com/iplus/p/4464676.html
Copyright © 2011-2022 走看看