datetime_utils.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import time
  2. from datetime import date, timedelta, datetime
  3. from dateutil import parser
  4. def add_days(dt: str, number: int, original_fmt: str = '%Y%m%d', dst_fmt: str = '%Y%m%d'):
  5. return (parse_datetime(dt, original_fmt) + timedelta(days=number)).strftime(dst_fmt)
  6. def date_to_timestamp(date_str: str, time_unit: int = 1) -> float:
  7. """
  8. 字符串日期转时间戳
  9. Args:
  10. date_str: 字符串的日期
  11. time_unit: 时间戳单位,1为秒(默认),2为毫秒,3为微秒
  12. Returns: 时间戳
  13. """
  14. return datetime_to_timestamp(parse_datetime(date_str), time_unit)
  15. def datetime_to_timestamp(date_time: datetime, time_unit: int = 1) -> float:
  16. """
  17. datetime 转时间戳
  18. Args:
  19. date_time: datetime
  20. time_unit: 时间戳单位,1为秒(默认),2为毫秒,3为微秒
  21. Returns: 时间戳
  22. """
  23. timestamp = date_time.timestamp() * 1000000
  24. timestamp = float(str(timestamp) + str("%06d" % date_time.microsecond))
  25. if time_unit == 3:
  26. return timestamp
  27. elif time_unit == 2:
  28. return timestamp / 1000
  29. else:
  30. return timestamp / 1000000
  31. def formatted_now(fmt: str = '%Y-%m-%d %H:%M:%S') -> str:
  32. return time.strftime(fmt, time.localtime())
  33. def get_date_by_priority(cli_dt: str, config_dt: str) -> str:
  34. # 计算实际日期,优先级: 命令行 > 配置文件 > 默认
  35. if cli_dt:
  36. dt = cli_dt
  37. elif config_dt:
  38. dt = config_dt
  39. else:
  40. dt = get_yesterday()
  41. return dt
  42. def get_date_range(some_date: str) -> [str]:
  43. """
  44. 获取日期范围
  45. Args:
  46. some_date: 日期参数,有四种表示法 —— 20210801、 20210801-、20210801-20210810、20210801,20210803,20210805
  47. Returns: 日期范围
  48. """
  49. if not some_date:
  50. return [get_yesterday()]
  51. date_range = []
  52. if len(some_date) == 8:
  53. date_range.append(some_date)
  54. elif (len(some_date) == 9 or len(some_date) == 17) and some_date[8] == '-':
  55. date_cursor = some_date[:8]
  56. if len(some_date) == 9:
  57. # 20210801-格式
  58. end_date = get_yesterday()
  59. else:
  60. # 20210801-20210810格式
  61. end_date = some_date[9:]
  62. while date_cursor <= end_date:
  63. date_range.append(date_cursor)
  64. date_cursor = (datetime.strptime(date_cursor, '%Y%m%d') + timedelta(days=1)).strftime('%Y%m%d')
  65. elif set([len(e) for e in some_date.split(',')]).pop() == 8:
  66. date_range = some_date.split(',')
  67. else:
  68. raise Exception('无效的日期表达形式 %s' % some_date)
  69. return date_range
  70. def parse_datetime(date_time: str, original_format: str = None) -> datetime:
  71. """
  72. 先识别日期,再按照指定格式输出
  73. %y 两位数的年份表示(00-99)
  74. %Y 四位数的年份表示(0000-9999)
  75. %m 月份(01-12)
  76. %d 月内中的一天(0-31)
  77. %H 24小时制小时数(0-23)
  78. %I 12小时制小时数(01-12)
  79. %M 分钟数(00-59)
  80. %S 秒(00-59)
  81. %a 本地简化星期名称
  82. %A 本地完整星期名称
  83. %b 本地简化的月份名称
  84. %B 本地完整的月份名称
  85. %c 本地相应的日期表示和时间表示
  86. %j 年内的一天(001-366)
  87. %p 本地A.M.或P.M.的等价符
  88. %U 一年中的星期数(00-53)星期天为星期的开始
  89. %w 星期(0-6),星期天为星期的开始
  90. %W 一年中的星期数(00-53)星期一为星期的开始
  91. %x 本地相应的日期表示
  92. %X 本地相应的时间表示
  93. %Z 当前时区的名称
  94. %% %号本身
  95. Args:
  96. date_time: 日期
  97. original_format: 原日期格式
  98. Returns:
  99. 转换后的日期
  100. """
  101. if not date_time:
  102. return None
  103. # raise ValueError('date_time is null')
  104. try:
  105. if original_format:
  106. parsed_date = datetime.strptime(date_time, original_format)
  107. else:
  108. parsed_date = parser.parse(date_time, fuzzy=True)
  109. except Exception as e:
  110. raise e
  111. return parsed_date
  112. def get_today(fmt: str = '%Y%m%d') -> str:
  113. return date.today().strftime(fmt)
  114. def get_yesterday(fmt: str = '%Y%m%d') -> str:
  115. return (date.today() - timedelta(days=1)).strftime(fmt)
  116. def local_2_utc(some_date: str) -> datetime:
  117. # 本地时间转 UTC 时间( -8:00 )
  118. # + ' 00:00:00'
  119. utc_date = datetime.utcfromtimestamp(date_to_timestamp(some_date))
  120. return utc_date
  121. if __name__ == '__main__':
  122. print(parse_datetime('2024年03月10日'.replace('年', '-').replace('月', '-').replace('日', '')))