DateUtils.py 8.2 KB

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