DateUtil.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. package com.sky.ioc.tool;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.time.Instant;
  5. import java.time.LocalDateTime;
  6. import java.time.ZoneId;
  7. import java.time.format.DateTimeFormatter;
  8. import java.util.*;
  9. /**
  10. * @Author : JCccc
  11. * @CreateTime : 2020/2/27
  12. * @Description :
  13. **/
  14. public class DateUtil {
  15. /**
  16. * 获取今天开始时间和结束时间
  17. *
  18. * @return
  19. */
  20. public static Map getTodayTime() {
  21. Long startTime = getStartTime();
  22. //Long endTime = getEndTime(); //当期时间
  23. //当期时间
  24. Long endTime = System.currentTimeMillis();
  25. DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  26. String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault()));
  27. String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault()));
  28. Map map = new HashMap();
  29. map.put("startDate", startTimeStr);
  30. map.put("endDate", endTimeStr);
  31. return map;
  32. }
  33. //获取今天日期 年月日
  34. public static Date getTodayYmd(){
  35. Date now = new Date();
  36. Calendar cal1 = Calendar.getInstance();
  37. cal1.setTime(now);
  38. // 将时分秒,毫秒域清零
  39. cal1.set(Calendar.HOUR_OF_DAY, 0);
  40. cal1.set(Calendar.MINUTE, 0);
  41. cal1.set(Calendar.SECOND, 0);
  42. cal1.set(Calendar.MILLISECOND, 0);
  43. return cal1.getTime();
  44. }
  45. //获取昨天日期 年月日
  46. public static Date getYesterdayYmd() {
  47. Calendar cal = new GregorianCalendar();
  48. cal.set(Calendar.HOUR_OF_DAY, 0);
  49. cal.set(Calendar.MINUTE, 0);
  50. cal.set(Calendar.SECOND, 0);
  51. cal.set(Calendar.MILLISECOND, 0);
  52. cal.add(Calendar.DAY_OF_MONTH, -1);
  53. return cal.getTime();
  54. }
  55. /**
  56. * 获取昨天开始时间和结束时间
  57. *
  58. * @return
  59. */
  60. public static Map getYesterdayTime() {
  61. Long startTime = getBeginDayOfYesterday();
  62. Long endTime = getEndDayOfYesterDay();
  63. DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  64. String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault()));
  65. String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault()));
  66. Map map = new HashMap();
  67. map.put("startDate", startTimeStr);
  68. map.put("endDate", endTimeStr);
  69. return map;
  70. }
  71. /**
  72. * 获取当月开始时间和结束时间
  73. *
  74. * @return
  75. */
  76. public static Map getMonthTime() {
  77. Long startTime = getMonthStartTime();
  78. Long endTime = getMonthEndTime();
  79. DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  80. String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault()));
  81. String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault()));
  82. Map map = new HashMap();
  83. map.put("startDate", startTimeStr);
  84. map.put("endDate", endTimeStr);
  85. return map;
  86. }
  87. /**
  88. * 获取上个月月开始时间和结束时间
  89. *
  90. * @return
  91. */
  92. public static Map getLastMonthTime() throws Exception {
  93. Long startTime = getLastMonthStartTime();
  94. Long endTime = getLastMonthEndTime();
  95. DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  96. String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault()));
  97. String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault()));
  98. Map map = new HashMap();
  99. map.put("startDate", startTimeStr);
  100. map.put("endDate", endTimeStr);
  101. return map;
  102. }
  103. //获取月均开始和结束时间
  104. public static Map getAverageTime(String minCreateTime) throws ParseException {
  105. Long yesterdayTimeEnd =getEndDayOfYesterDay();
  106. DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  107. //昨天的时间
  108. String yesterdayStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(yesterdayTimeEnd), ZoneId.systemDefault()));
  109. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  110. String yesterdayBefore30Str = "";
  111. Calendar calc = Calendar.getInstance();
  112. calc.setTime(sdf.parse(yesterdayStr));
  113. calc.add(Calendar.DATE, -30);
  114. calc.set(Calendar.HOUR_OF_DAY, 0);
  115. calc.set(Calendar.MINUTE, 0);
  116. calc.set(Calendar.SECOND, 0);
  117. calc.set(Calendar.MILLISECOND, 0);
  118. Date minDate = calc.getTime();
  119. yesterdayBefore30Str = sdf.format(minDate);
  120. int num = daysBetween(yesterdayBefore30Str, yesterdayStr);
  121. int checkNum = daysBetween(minCreateTime, yesterdayBefore30Str);
  122. System.out.println("checkNum:"+checkNum);
  123. Map map = new HashMap();
  124. if (checkNum < 0) {
  125. int numNew = daysBetween(minCreateTime, yesterdayStr);
  126. map.put("startDate", minCreateTime);
  127. map.put("endDate", yesterdayStr);
  128. map.put("num", Math.abs(numNew)); //取绝对值
  129. return map;
  130. }
  131. map.put("startDate", yesterdayBefore30Str);
  132. map.put("endDate", yesterdayStr);
  133. map.put("num", num);
  134. return map;
  135. }
  136. public static int daysBetween(String smdate, String bdate) throws ParseException {
  137. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
  138. Calendar cal = Calendar.getInstance();
  139. cal.setTime(sdf.parse(smdate));
  140. long time1 = cal.getTimeInMillis();
  141. cal.setTime(sdf.parse(bdate));
  142. long time2 = cal.getTimeInMillis();
  143. long between_days = (time2 - time1) / (1000 * 3600 * 24);
  144. return Integer.parseInt(String.valueOf(between_days));
  145. }
  146. /**
  147. * 获取今天开始时间
  148. */
  149. private static Long getStartTime() {
  150. Calendar todayStart = Calendar.getInstance();
  151. todayStart.set(Calendar.HOUR_OF_DAY, 0);
  152. todayStart.set(Calendar.MINUTE, 0);
  153. todayStart.set(Calendar.SECOND, 0);
  154. todayStart.set(Calendar.MILLISECOND, 0);
  155. return todayStart.getTimeInMillis();
  156. }
  157. /**
  158. * 获取今天结束时间
  159. */
  160. private static Long getEndTime() {
  161. Calendar todayEnd = Calendar.getInstance();
  162. todayEnd.set(Calendar.HOUR, 23);
  163. todayEnd.set(Calendar.MINUTE, 59);
  164. todayEnd.set(Calendar.SECOND, 59);
  165. todayEnd.set(Calendar.MILLISECOND, 999);
  166. return todayEnd.getTime().getTime();
  167. }
  168. /**
  169. * 获取当月开始时间
  170. */
  171. public static Long getMonthStartTime() {
  172. Long currentTime = System.currentTimeMillis();
  173. String timeZone = "GMT+8:00";
  174. Calendar calendar = Calendar.getInstance();// 获取当前日期
  175. calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
  176. calendar.setTimeInMillis(currentTime);
  177. calendar.add(Calendar.YEAR, 0);
  178. calendar.add(Calendar.MONTH, 0);
  179. calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
  180. calendar.set(Calendar.HOUR_OF_DAY, 0);
  181. calendar.set(Calendar.MINUTE, 0);
  182. calendar.set(Calendar.SECOND, 0);
  183. calendar.set(Calendar.MILLISECOND, 0);
  184. return calendar.getTimeInMillis();
  185. }
  186. /**
  187. * 获取当月的结束时间戳
  188. */
  189. public static Long getMonthEndTime() {
  190. Long currentTime = System.currentTimeMillis();
  191. String timeZone = "GMT+8:00";
  192. Calendar calendar = Calendar.getInstance();// 获取当前日期
  193. calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
  194. calendar.setTimeInMillis(currentTime);
  195. calendar.add(Calendar.YEAR, 0);
  196. calendar.add(Calendar.MONTH, 0);
  197. calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天
  198. calendar.set(Calendar.HOUR_OF_DAY, 23);
  199. calendar.set(Calendar.MINUTE, 59);
  200. calendar.set(Calendar.SECOND, 59);
  201. calendar.set(Calendar.MILLISECOND, 999);
  202. return calendar.getTimeInMillis();
  203. }
  204. public static Long getLastMonthStartTime() throws Exception {
  205. Long currentTime = System.currentTimeMillis();
  206. String timeZone = "GMT+8:00";
  207. Calendar calendar = Calendar.getInstance();// 获取当前日期
  208. calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
  209. calendar.setTimeInMillis(currentTime);
  210. calendar.add(Calendar.YEAR, 0);
  211. calendar.add(Calendar.MONTH, -1);
  212. calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
  213. calendar.set(Calendar.HOUR_OF_DAY, 0);
  214. calendar.set(Calendar.MINUTE, 0);
  215. calendar.set(Calendar.SECOND, 0);
  216. calendar.set(Calendar.MILLISECOND, 0);
  217. return calendar.getTimeInMillis();
  218. }
  219. public static Long getLastMonthEndTime() {
  220. Long currentTime = System.currentTimeMillis();
  221. String timeZone = "GMT+8:00";
  222. Calendar calendar = Calendar.getInstance();// 获取当前日期
  223. calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
  224. calendar.setTimeInMillis(currentTime);
  225. calendar.add(Calendar.YEAR, 0);
  226. calendar.add(Calendar.MONTH, -1);
  227. calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天
  228. calendar.set(Calendar.HOUR_OF_DAY, 23);
  229. calendar.set(Calendar.MINUTE, 59);
  230. calendar.set(Calendar.SECOND, 59);
  231. calendar.set(Calendar.MILLISECOND, 999);
  232. return calendar.getTimeInMillis();
  233. }
  234. public static Long getBeginDayOfYesterday() {
  235. Calendar cal = new GregorianCalendar();
  236. cal.set(Calendar.HOUR_OF_DAY, 0);
  237. cal.set(Calendar.MINUTE, 0);
  238. cal.set(Calendar.SECOND, 0);
  239. cal.set(Calendar.MILLISECOND, 0);
  240. cal.add(Calendar.DAY_OF_MONTH, -1);
  241. return cal.getTimeInMillis();
  242. }
  243. public static Long getEndDayOfYesterDay() {
  244. Calendar cal = new GregorianCalendar();
  245. cal.set(Calendar.HOUR_OF_DAY, 23);
  246. cal.set(Calendar.MINUTE, 59);
  247. cal.set(Calendar.SECOND, 59);
  248. cal.add(Calendar.DAY_OF_MONTH, -1);
  249. return cal.getTimeInMillis();
  250. }
  251. //获取今年是哪一年
  252. public static Integer getNowYear() {
  253. Date date = new Date();
  254. GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
  255. gc.setTime(date);
  256. return Integer.valueOf(gc.get(1));
  257. }
  258. public static Map getThisYearTime() throws Exception {
  259. Long startTime = getBeginDayOfYear();
  260. Long endTime = getEndDayOfYear();
  261. DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  262. String startTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault()));
  263. String endTimeStr = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endTime), ZoneId.systemDefault()));
  264. Map map = new HashMap();
  265. map.put("startDate", startTimeStr);
  266. map.put("endDate", endTimeStr);
  267. return map;
  268. }
  269. //获取本年的开始时间
  270. public static Long getBeginDayOfYear() {
  271. Calendar cal = Calendar.getInstance();
  272. cal.set(Calendar.YEAR, getNowYear());
  273. // cal.set
  274. cal.set(Calendar.MONTH, Calendar.JANUARY);
  275. cal.set(Calendar.DATE, 1);
  276. return getDayStartTime(cal.getTime());
  277. }
  278. //获取本年的结束时间
  279. public static Long getEndDayOfYear() {
  280. Calendar cal = Calendar.getInstance();
  281. cal.set(Calendar.YEAR, getNowYear());
  282. cal.set(Calendar.MONTH, Calendar.DECEMBER);
  283. cal.set(Calendar.DATE, 31);
  284. return getDayEndTime(cal.getTime());
  285. }
  286. //获取某个日期的开始时间
  287. public static Long getDayStartTime(Date d) {
  288. Calendar calendar = Calendar.getInstance();
  289. if(null != d) calendar.setTime(d);
  290. calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
  291. calendar.set(Calendar.MILLISECOND, 0);
  292. return calendar.getTimeInMillis();
  293. }
  294. //获取某个日期的结束时间
  295. public static Long getDayEndTime(Date d) {
  296. Calendar calendar = Calendar.getInstance();
  297. if(null != d) calendar.setTime(d);
  298. calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
  299. calendar.set(Calendar.MILLISECOND, 999);
  300. return calendar.getTimeInMillis();
  301. }
  302. /**
  303. * 获取两个日期之间的所有日期 (年月日)
  304. *
  305. * @param startTime
  306. * @param endTime
  307. * @return
  308. */
  309. public static List<String> getBetweenDays(String startTime, String endTime){
  310. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
  311. // 声明保存日期集合
  312. List<String> list = new ArrayList<String>();
  313. try {
  314. // 转化成日期类型
  315. Date startDate = sdf.parse(startTime);
  316. Date endDate = sdf.parse(endTime);
  317. //用Calendar 进行日期比较判断
  318. Calendar calendar = Calendar.getInstance();
  319. while (startDate.getTime()<=endDate.getTime()){
  320. // 把日期添加到集合
  321. list.add(sdf.format(startDate));
  322. // 设置日期
  323. calendar.setTime(startDate);
  324. //把日期增加一天
  325. calendar.add(Calendar.DATE, 1);
  326. // 获取增加后的日期
  327. startDate=calendar.getTime();
  328. }
  329. } catch (ParseException e) {
  330. e.printStackTrace();
  331. }
  332. return list;
  333. }
  334. /**
  335. * 计算两个日期直接相差的小时
  336. * */
  337. public static long hoursBetween(String startTime, String endTime) {
  338. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  339. long nd = 1000 * 24 * 60 * 60;
  340. long nh = 1000 * 60 * 60;
  341. long hour = 0;
  342. // 获得两个时间的毫秒时间差异
  343. Date startDate = null;
  344. try {
  345. startDate = sdf.parse(startTime);
  346. Date endDate = sdf.parse(endTime);
  347. long diff = endDate.getTime() - startDate.getTime();
  348. // 计算差多少小时
  349. hour = diff / nh;
  350. } catch (ParseException e) {
  351. throw new RuntimeException(e);
  352. }
  353. return hour;
  354. }
  355. public static void main(String[] args) throws Exception {
  356. /* Map todayTime = getTodayTime();
  357. System.out.println("今天:" + todayTime.toString());
  358. Map yesterdayTime = getYesterdayTime();
  359. System.out.println("昨天:" + yesterdayTime.toString());
  360. Map monthTime = getMonthTime();
  361. System.out.println("当月:" + monthTime.toString());
  362. Map lastMonthTime = getLastMonthTime();
  363. System.out.println("上个月:" + lastMonthTime.toString());
  364. */
  365. String startStr = "2021/03/01 00:00:00";
  366. String endStr = "2021/03/09 00:00:00";
  367. // List<String> list = getBetweenDays(startStr, endStr);
  368. System.out.println(hoursBetween(startStr,endStr));
  369. }
  370. }