DateUtils.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. import time
  2. from datetime import date, datetime, timedelta
  3. import calendar
  4. from dateutil.relativedelta import relativedelta
  5. class DateUtils:
  6. """
  7. 时间相关函数封装
  8. """
  9. def __init__(self):
  10. self.today = datetime.strptime(datetime.today().strftime("%Y-%m-%d"), "%Y-%m-%d")
  11. self.daydelta = timedelta(days=1)
  12. self.now = datetime.now()
  13. def add_days(self,str, interval):
  14. return (datetime.strptime(str,'%Y-%m-%d')+timedelta(days=interval)).strftime('%Y-%m-%d')
  15. def split_date(self,start, end, interval, func):
  16. """把时间拆分多次运行"""
  17. st = start
  18. et = self.add_days(st, interval - 1)
  19. while True:
  20. if et >= end:
  21. et = end
  22. print(f"{st}~{et}")
  23. func(st, et)
  24. break
  25. else:
  26. print(f"{st}~{et}")
  27. func(st,et)
  28. st=self.add_days(et, 1)
  29. et=self.add_days(st, interval - 1)
  30. def getDateLists(self, begin, end):
  31. """
  32. 返回一个时间列表
  33. """
  34. interval = self.getInterval(begin, end)
  35. return [self.getLastDays(begin, -x) for x in range(interval + 1)]
  36. def getTodayOrYestoday(self):
  37. """
  38. 如果当天零点 则返回昨天
  39. 否则返回今天
  40. :return:
  41. """
  42. if self.now.hour==0:
  43. return self.get_n_days(-1)
  44. else:
  45. return self.get_n_days(0)
  46. def getMonthLists(self, begin, end):
  47. begin_date = datetime.strptime(begin, "%Y-%m").date()
  48. end_date = datetime.strptime(end, '%Y-%m').date()
  49. temp = end_date
  50. month_list = []
  51. while temp >= begin_date:
  52. month_list.append(temp.strftime('%Y-%m'))
  53. temp = self.get_before_month(temp.year, temp.month, 1, 1)
  54. month_list.reverse()
  55. return month_list
  56. def getLastDays(self, begin, interval):
  57. """
  58. :param begin:
  59. :param interval: 正数是之前几天, 负数是之后几天
  60. :return:
  61. """
  62. start = datetime(int(begin[0:4]), int(begin[5:7]), int(begin[8:10]))
  63. delta = timedelta(days=1)
  64. if interval < 0:
  65. for _ in range(0, -interval):
  66. start = start + delta
  67. else:
  68. for _ in range(0, interval):
  69. start = start - delta
  70. return start.strftime("%Y-%m-%d")
  71. def get_n_month_ago_begin(self, begin, n):
  72. year = int(begin[:4])
  73. month = int(begin[5:7])
  74. if n > 0:
  75. for i in range(0, n):
  76. month -= 1
  77. if month == 0:
  78. month = 12
  79. year -= 1
  80. else:
  81. for i in range(0, -n):
  82. if month == 12:
  83. month = 0
  84. year += 1
  85. month += 1
  86. return date(year, month, 1).strftime('%Y-%m')
  87. def get_n_days(self, interval=0, flag=0):
  88. """
  89. 负数,过去的几天
  90. 正数,未来的几天
  91. :param interval:
  92. :param flag: 1 返回 timedelta
  93. :return:
  94. """
  95. start = self.today
  96. if interval < 0:
  97. for _ in range(0, -interval):
  98. start = start - self.daydelta
  99. else:
  100. for _ in range(0, interval):
  101. start = start + self.daydelta
  102. if flag == 1:
  103. return start
  104. else:
  105. return start.strftime("%Y-%m-%d")
  106. def getNow(self):
  107. """
  108. 获取当天时间
  109. :return: 当天时间的字符串
  110. """
  111. now = datetime.now()
  112. return now.strftime("%Y-%m-%d")
  113. def getWeek(self, begin):
  114. return datetime(int(begin[0:4]), int(begin[5:7]), int(begin[8:10])).strftime("%w")
  115. def get_today_before_month(self, n):
  116. """
  117. 获取之前n个月
  118. :param n:
  119. :return:
  120. """
  121. year = time.localtime()[0]
  122. month = time.localtime()[1]
  123. for i in range(0, n):
  124. month -= 1
  125. if month == 0:
  126. month = 12
  127. year -= 1
  128. return year, month
  129. def get_one_month_ago(self, flag=0):
  130. """
  131. 返回一个月前的时间, 默认返回格式化时间字符串
  132. flag 1 返回 datetime
  133. :param flag:
  134. :return:
  135. """
  136. x = self.today-relativedelta(months=1)
  137. if flag == 1:
  138. return x
  139. else:
  140. return x.strftime("%Y-%m-%d")
  141. def get_today_before_month_list(self, n=0):
  142. year = time.localtime()[0]
  143. month = time.localtime()[1]
  144. ret = []
  145. for i in range(0, n):
  146. month -= 1
  147. if month == 0:
  148. month = 12
  149. year -= 1
  150. if month >= 10:
  151. ret.append(str(year) + "-" + str(month) + "-" + "01")
  152. else:
  153. ret.append(str(year) + "-0" + str(month) + "-" + "01")
  154. return ret
  155. def get_before_month(self, year, month, day, n):
  156. for i in range(0, n):
  157. month -= 1
  158. if month == 0:
  159. month = 12
  160. year -= 1
  161. day = min(day, calendar.monthrange(year, month)[1])
  162. return date(year, month, day)
  163. def getInterval(self, begin, end):
  164. t1 = datetime(int(begin[0:4]), int(begin[5:7]), int(begin[8:10]))
  165. t2 = datetime(int(end[0:4]), int(end[5:7]), int(end[8:10]))
  166. return (t2 - t1).days
  167. def month_first_day(self, flag=False):
  168. """
  169. 返回当月第一天
  170. 若为1号,则返回上个月1号
  171. :param flag:
  172. :return:
  173. """
  174. if self.today.day == 1:
  175. # 如果当日是月初1号,则返回上月1号
  176. if self.today.month == 1:
  177. tmp = date(self.today.year - 1, 12, 1)
  178. else:
  179. tmp = date(self.today.year, self.today.month - 1, 1)
  180. else:
  181. tmp = date(self.today.year, self.today.month, 1)
  182. return tmp if flag else tmp.strftime("%Y-%m-%d")
  183. def get_today(self, flag=False):
  184. return self.today if flag else self.today.strftime("%Y-%m-%d")
  185. def get_n_pre_month_first_day(self, n, flag=False):
  186. """
  187. 获取 n 个月前第一天
  188. """
  189. r = self.get_before_month(self.today.year, self.today.month, 1, n)
  190. return r if flag else r.strftime("%Y-%m-%d")
  191. def get_n_month_ago(self, n, flag=0):
  192. d = self.get_before_month(self.today.year, self.today.month, self.today.day, n)
  193. return d.strftime("%Y-%m-%d") if flag == 0 else d
  194. def get_week_ago(self, flag=False):
  195. """
  196. :param: None
  197. :return: 7 days ago
  198. """
  199. tmp = (self.today - timedelta(days=7))
  200. return tmp if flag else tmp.strftime("%Y-%m-%d")
  201. def get_week_first_day(self, flag=False):
  202. """
  203. 返回当前天的一周开始
  204. :param flag:
  205. :return:
  206. """
  207. # print self.today.day
  208. if self.today.weekday() == 0:
  209. # 如果当天是周一,则返回上周一日期
  210. tmp = self.today - timedelta(days=7)
  211. else:
  212. tmp = self.today - timedelta(days=self.today.weekday())
  213. return tmp if flag else tmp.strftime("%Y-%m-%d")
  214. def get_one_day_ago(self, flag=False):
  215. """
  216. :param: None
  217. :return: 1 day ago
  218. """
  219. tmp = (self.today - timedelta(days=1))
  220. return tmp if flag else tmp.strftime("%Y-%m-%d")
  221. def get_start(self, s_start=date.today().strftime("%Y-%m-%d")):
  222. return datetime(int(s_start[0:4]), int(s_start[5:7]), int(s_start[8:10]))
  223. def get_n_hours_ago(self, n=1, flag = 0):
  224. """
  225. get n hous ago
  226. flag is True return datetime format
  227. default 1 hours ago
  228. if n > 0 :
  229. 过去时间
  230. else:
  231. 未来时间
  232. :param n:
  233. :return:
  234. """
  235. r = self.now - timedelta(hours=n)
  236. return r if flag else r.strftime("%Y-%m-%d %H:00:00")
  237. def get_n_minutes_ago(self, n=1, string=True):
  238. """
  239. get n minutes ago
  240. default 1 minutes ago
  241. if n > 0 :
  242. 过去时间
  243. else:
  244. 未来时间
  245. :param n:
  246. :return:
  247. """
  248. if string:
  249. return (self.now - timedelta(minutes=n)).strftime("%Y-%m-%d %H:%M")
  250. else:
  251. return self.now - timedelta(minutes=n)
  252. def get_n_pre_month_last_day(self, n=0, flag=False):
  253. """
  254. 获取 n 个月前的最后一天
  255. :param n:
  256. :param flag:
  257. :return:
  258. """
  259. r = self.get_before_month(self.today.year, self.today.month, 1, n)
  260. num = calendar.monthrange(r.year, r.month)[1]
  261. x = r.replace(day=num)
  262. return x if flag else x.strftime("%Y-%m-%d")
  263. @staticmethod
  264. def str_to_stamp(str):
  265. return int(time.mktime(time.strptime(str,'%Y-%m-%d')))
  266. if __name__ == "__main__":
  267. ut = DateUtils()
  268. # end = ut.now.strftime('%Y-%m') + '-01 00:00:00'