SmartDateUtil.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. package net.lab1024.smartadmin.util;
  2. import java.math.BigDecimal;
  3. import java.math.RoundingMode;
  4. import java.text.SimpleDateFormat;
  5. import java.time.LocalDateTime;
  6. import java.time.ZoneId;
  7. import java.util.ArrayList;
  8. import java.util.Calendar;
  9. import java.util.Date;
  10. import java.util.GregorianCalendar;
  11. import java.util.List;
  12. import java.util.TimeZone;
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.apache.commons.lang3.time.DateUtils;
  15. /**
  16. * 线程安全的date工具类
  17. *
  18. * @author jiaozi
  19. */
  20. public class SmartDateUtil extends DateUtils {
  21. private static final ThreadLocal<DateFormats> dateFormats = new ThreadLocal<DateFormats>() {
  22. @Override
  23. protected DateFormats initialValue() {
  24. return new DateFormats();
  25. }
  26. };
  27. public static final int HOUR_MIN = 60;
  28. public static final int DAY_MI_SECOND = 24 * 60 * 60 * 1000;
  29. public static final int DAY_MINUTE_SECOND = 60 * 1000;
  30. public static final int DAY_MIAO_SECOND = 60 * 1000 * 60;
  31. public static Date getDate() {
  32. LocalDateTime localDateTimeNow = LocalDateTime.now();
  33. Date from = Date.from(localDateTimeNow.atZone(ZoneId.systemDefault()).toInstant());
  34. return from;
  35. }
  36. public static String formatYMD(Date date) {
  37. return dateFormats.get().ymd.format(date);
  38. }
  39. public static String formatYMDDigital(Date date) {
  40. return dateFormats.get().ymdDigital.format(date);
  41. }
  42. public static String formatYMDHMSDigital(Date date) {
  43. return dateFormats.get().ymdhmsDigital.format(date);
  44. }
  45. public static String formatYM(Date date) {
  46. return dateFormats.get().ym.format(date);
  47. }
  48. public static String formatHMS(Date date) {
  49. return dateFormats.get().hms.format(date);
  50. }
  51. public static String formatHM(Date date) {
  52. return dateFormats.get().hm.format(date);
  53. }
  54. public static String formatYMDHM(Date date) {
  55. return dateFormats.get().ymdhm.format(date);
  56. }
  57. public static String formatYMDHMS(Date date) {
  58. return dateFormats.get().ymdhms.format(date);
  59. }
  60. public static String formatYMDChinese(Date date) {
  61. return dateFormats.get().ymdChinese.format(date);
  62. }
  63. public static String formatYMDSlash(Date date) {
  64. return dateFormats.get().ymdSlash.format(date);
  65. }
  66. public static Date parseYMD(String dateStr) {
  67. return parse(dateFormats.get().ymd, dateStr);
  68. }
  69. public static Date parseYMDDigital(String dateStr) {
  70. return parse(dateFormats.get().ymdDigital, dateStr);
  71. }
  72. public static Date parseYMDHMSDigital(String dateStr) {
  73. return parse(dateFormats.get().ymdhmsDigital, dateStr);
  74. }
  75. public static Date parseformatYMDChinese(String dateStr) {
  76. return parse(dateFormats.get().ymdChinese, dateStr);
  77. }
  78. public static Date parseYM(String dateStr) {
  79. return parse(dateFormats.get().ym, dateStr);
  80. }
  81. public static Date parseYMDHMS(String dateStr) {
  82. return parse(dateFormats.get().ymdhms, dateStr);
  83. }
  84. public static Date parseYMDHM(String dateStr) {
  85. return parse(dateFormats.get().ymdhm, dateStr);
  86. }
  87. public static Date parseTodayHMS(String dateStr) {
  88. String today = formatYMD(new Date());
  89. String todayDateStr = String.format("%s %s", today, dateStr);
  90. return parse(dateFormats.get().ymdhms, todayDateStr);
  91. }
  92. /**
  93. * 判断当前时间是否在某段时间内 参数不区分先后顺序
  94. */
  95. public static boolean isDuringTwoDate(Date date, Date another) {
  96. long dateTime = date.getTime();
  97. long anotherTime = another.getTime();
  98. long currentTime = System.currentTimeMillis();
  99. if (currentTime > dateTime && currentTime < anotherTime) {
  100. return true;
  101. } else if (currentTime > anotherTime && currentTime < dateTime) {
  102. return true;
  103. } else {
  104. return false;
  105. }
  106. }
  107. public static Date parse(SimpleDateFormat format, String dateStr) {
  108. try {
  109. Date d = format.parse(dateStr);
  110. Calendar c = Calendar.getInstance();
  111. c.setTime(d);
  112. int year = c.get(Calendar.YEAR);
  113. if (year >= 1000 && year <= 9999) {
  114. return d;
  115. } else {
  116. return null;
  117. }
  118. } catch (Exception ex) {
  119. return null;
  120. }
  121. }
  122. public static long daysOffset(Date date1, Date date2) {
  123. date1 = parseYMD(formatYMD(date1));
  124. date2 = parseYMD(formatYMD(date2));
  125. return (date1.getTime() - date2.getTime()) / DAY_MI_SECOND;
  126. }
  127. public static long minutesOffset(Date date1, Date date2) {
  128. date1 = parseYMDHMS(formatYMDHMS(date1));
  129. date2 = parseYMDHMS(formatYMDHMS(date2));
  130. return (date1.getTime() - date2.getTime()) / DAY_MINUTE_SECOND;
  131. }
  132. public static long miaoOffset(Date date1, Date date2) {
  133. date1 = parseYMDHMS(formatYMDHMS(date1));
  134. date2 = parseYMDHMS(formatYMDHMS(date2));
  135. return (date1.getTime() - date2.getTime()) / DAY_MINUTE_SECOND;
  136. }
  137. /**
  138. * 今天是星期几 , 7表示星期日
  139. *
  140. * @return
  141. */
  142. public static int getTodayDayOfWeek() {
  143. Calendar now = Calendar.getInstance();
  144. int dayOfweek = now.get(Calendar.DAY_OF_WEEK);
  145. dayOfweek--;
  146. if (dayOfweek == 0) {
  147. dayOfweek = 7;
  148. }
  149. return dayOfweek;
  150. }
  151. public static boolean isTodaytDay(Date date) {
  152. Calendar calendar = Calendar.getInstance();
  153. calendar.setTime(date);
  154. Calendar todayCalendar = Calendar.getInstance();
  155. if (calendar.get(Calendar.YEAR) != todayCalendar.get(Calendar.YEAR)) {
  156. return false;
  157. } else if (calendar.get(Calendar.MONTH) != todayCalendar.get(Calendar.MONTH)) {
  158. return false;
  159. } else if (calendar.get(Calendar.DAY_OF_MONTH) != todayCalendar.get(Calendar.DAY_OF_MONTH)) {
  160. return false;
  161. }
  162. return true;
  163. }
  164. /**
  165. * 设置Calendar的小时、分钟、秒、毫秒
  166. *
  167. * @param calendar 日历
  168. * @param hour 小时
  169. * @param minute 分钟
  170. * @param second 秒
  171. * @param milliSecond 毫秒
  172. */
  173. public static void setCalender(Calendar calendar, int hour, int minute, int second, int milliSecond) {
  174. calendar.set(Calendar.HOUR_OF_DAY, hour);
  175. calendar.set(Calendar.MINUTE, minute);
  176. calendar.set(Calendar.SECOND, second);
  177. calendar.set(Calendar.MILLISECOND, milliSecond);
  178. }
  179. /**
  180. * 获取指定天开始时间
  181. *
  182. * @param date 日期
  183. * @return 获得该日期的开始
  184. */
  185. public static Date getDayBegin(Date date) {
  186. Calendar calendar = Calendar.getInstance();
  187. calendar.setTime(date);
  188. setCalender(calendar, 0, 0, 0, 0);
  189. return calendar.getTime();
  190. }
  191. /**
  192. * 获取指定天结束时间
  193. *
  194. * @param date 日期
  195. * @return 获得该日期的结束
  196. */
  197. public static Date getDayEnd(Date date) {
  198. Calendar calendar = Calendar.getInstance();
  199. calendar.setTime(date);
  200. setCalender(calendar, 23, 59, 59, 999);
  201. return calendar.getTime();
  202. }
  203. /**
  204. * 获取该日期当月第一天
  205. *
  206. * @param date
  207. * @return
  208. */
  209. public static Date getMonthBegin(Date date) {
  210. Calendar calendar = Calendar.getInstance();
  211. calendar.setTime(getDayBegin(date));
  212. calendar.set(Calendar.DAY_OF_MONTH, 1);
  213. return calendar.getTime();
  214. }
  215. /**
  216. * 获取该日期当月最后一天getAgeByBirthday
  217. *
  218. * @param date
  219. * @return
  220. */
  221. public static Date getMonthEnd(Date date) {
  222. Calendar calendar = Calendar.getInstance();
  223. calendar.setTime(getDayEnd(date));
  224. calendar.add(Calendar.MONTH, 1);
  225. calendar.set(Calendar.DAY_OF_MONTH, 1);
  226. calendar.add(Calendar.DAY_OF_MONTH, - 1);
  227. return calendar.getTime();
  228. }
  229. public static String timeDifference(Date endDate) {
  230. Date nowDate = new Date();
  231. long nd = 1000 * 24 * 60 * 60;
  232. long nh = 1000 * 60 * 60;
  233. long nm = 1000 * 60;
  234. // 获得两个时间的毫秒时间差异
  235. long diff = nowDate.getTime() - endDate.getTime();
  236. // 计算差多少天
  237. long day = diff / nd;
  238. if (day > 0) {
  239. return day + "天前";
  240. }
  241. // 计算差多少小时
  242. long hour = diff % nd / nh;
  243. if (hour > 0) {
  244. return hour + "小时前";
  245. }
  246. // 计算差多少分钟
  247. long min = diff % nd % nh / nm;
  248. if (min > 0) {
  249. return "1小时内";
  250. }
  251. return "1小时内";
  252. }
  253. /**
  254. * 计算所用时长
  255. *
  256. * @param startDate
  257. * @param endDate
  258. * @return
  259. */
  260. public static BigDecimal timeDifferenceMin(Date startDate, Date endDate) {
  261. long nm = 1000 * 60;
  262. // 获得两个时间的毫秒时间差异
  263. long diff = endDate.getTime() - startDate.getTime();
  264. BigDecimal min = BigDecimal.valueOf(diff).divide(BigDecimal.valueOf(nm), RoundingMode.HALF_UP);
  265. return min;
  266. }
  267. /**
  268. * 功能描述: 是否为当天
  269. *
  270. * @param dateStr yyyy-mm-dd
  271. * @return
  272. * @auther yandanyang
  273. * @date 2018/10/16 0016 下午 17:43
  274. */
  275. public static boolean isCurrentDayYMD(String dateStr) {
  276. if (StringUtils.isEmpty(dateStr)) {
  277. return true;
  278. }
  279. String current = SmartDateUtil.formatYMD(new Date());
  280. if (current.equals(dateStr)) {
  281. return true;
  282. }
  283. return false;
  284. }
  285. /**
  286. * 功能描述: 是否为当月
  287. *
  288. * @param dateStr yyyy-mm-dd
  289. * @return
  290. * @auther yandanyang
  291. * @date 2018/10/16 0016 下午 17:43
  292. */
  293. public static boolean isCurrentMonthYMD(String dateStr) {
  294. if (StringUtils.isEmpty(dateStr)) {
  295. return true;
  296. }
  297. String queryDate = SmartDateUtil.formatYM(SmartDateUtil.parseYMD(dateStr));
  298. String current = SmartDateUtil.formatYM(new Date());
  299. if (current.equals(queryDate)) {
  300. return true;
  301. }
  302. return false;
  303. }
  304. public static boolean isCurrentMonthYM(String dateStr) {
  305. if (StringUtils.isEmpty(dateStr)) {
  306. return true;
  307. }
  308. String current = SmartDateUtil.formatYM(new Date());
  309. if (current.equals(dateStr)) {
  310. return true;
  311. }
  312. return false;
  313. }
  314. /**
  315. * 获取本周的开始时间
  316. *
  317. * @return
  318. */
  319. public static Date getBeginDayOfWeek() {
  320. Date date = new Date();
  321. if (date == null) {
  322. return null;
  323. }
  324. Calendar cal = Calendar.getInstance();
  325. cal.setTime(date);
  326. int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
  327. if (dayofweek == 1) {
  328. dayofweek += 7;
  329. }
  330. cal.add(Calendar.DATE, 2 - dayofweek);
  331. return getDayBegin(cal.getTime());
  332. }
  333. /**
  334. * 获取本周的结束时间
  335. *
  336. * @return
  337. */
  338. public static Date getEndDayOfWeek() {
  339. Calendar cal = Calendar.getInstance();
  340. cal.setTime(getBeginDayOfWeek());
  341. cal.add(Calendar.DAY_OF_WEEK, 6);
  342. Date weekEndSta = cal.getTime();
  343. return getDayEnd(weekEndSta);
  344. }
  345. /**
  346. * 获取两个日期区间的日期(包括这两个日期)
  347. */
  348. public static List<String> getiIntervalDate(String dateBegin, String dateEnd) {
  349. List<String> dateList = new ArrayList<>();
  350. Date startDate = SmartDateUtil.parseYMDHMS(dateBegin);
  351. Date endDate = SmartDateUtil.parseYMDHMS(dateEnd);
  352. Calendar cal = Calendar.getInstance();
  353. cal.setTime(startDate);
  354. dateList.add(dateBegin);
  355. while (cal.getTime().compareTo(endDate) < 0) {
  356. cal.add(Calendar.DAY_OF_MONTH, 1);
  357. if(cal.getTime().compareTo(endDate) > 0){
  358. cal.setTime(endDate);
  359. }
  360. dateList.add(SmartDateUtil.formatYMDHMS(cal.getTime()));
  361. }
  362. return dateList;
  363. }
  364. /**
  365. * 获取两个日期区间的日期(包括这两个日期)
  366. */
  367. public static List<String> getiIntervalHour(String dateBegin, String dateEnd) {
  368. List<String> dateList = new ArrayList<>();
  369. Date startDate = SmartDateUtil.parseYMDHMS(dateBegin);
  370. Date endDate = SmartDateUtil.parseYMDHMS(dateEnd);
  371. Calendar cal = Calendar.getInstance();
  372. cal.setTime(startDate);
  373. dateList.add(dateBegin);
  374. while (cal.getTime().compareTo(endDate) < 0) {
  375. cal.add(Calendar.MINUTE, 10);
  376. if(cal.getTime().compareTo(endDate) > 0){
  377. cal.setTime(endDate);
  378. }
  379. dateList.add(SmartDateUtil.formatYMDHMS(cal.getTime()));
  380. }
  381. return dateList;
  382. }
  383. /**
  384. * 返回某个日期后几天的日期
  385. *
  386. * @param date
  387. * @param i
  388. * @return
  389. */
  390. public static Date getNextDay(Date date, int i) {
  391. Calendar cal = new GregorianCalendar();
  392. cal.setTime(date);
  393. cal.set(Calendar.DATE, cal.get(Calendar.DATE) + i);
  394. return cal.getTime();
  395. }
  396. /**
  397. * 返回某个日期前几天的日期
  398. *
  399. * @param date
  400. * @param i
  401. * @return
  402. */
  403. public static Date getFrontDay(Date date, int i) {
  404. Calendar cal = new GregorianCalendar();
  405. cal.setTime(date);
  406. cal.set(Calendar.DATE, cal.get(Calendar.DATE) - i);
  407. return cal.getTime();
  408. }
  409. /**
  410. * 获取昨天的开始时间
  411. *
  412. * @return
  413. */
  414. public static Date getBeginDayOfYesterday() {
  415. Calendar cal = new GregorianCalendar();
  416. cal.setTime(getDayBegin(new Date()));
  417. cal.add(Calendar.DAY_OF_MONTH, - 1);
  418. return cal.getTime();
  419. }
  420. /**
  421. * 获取昨天的结束时间
  422. *
  423. * @return
  424. */
  425. public static Date getEndDayOfYesterDay() {
  426. Calendar cal = new GregorianCalendar();
  427. cal.setTime(getDayEnd(new Date()));
  428. cal.add(Calendar.DAY_OF_MONTH, - 1);
  429. return cal.getTime();
  430. }
  431. public static Integer getDayNumOfMonth(Date date) {
  432. Calendar c = Calendar.getInstance();
  433. c.setTime(date);
  434. Integer num = c.getActualMaximum(Calendar.DAY_OF_MONTH);
  435. return num;
  436. }
  437. /**
  438. * 转换日期(格式:年-月-日 时:分--分自定义)
  439. */
  440. public static String formatYMDH(Date date, String minute) {
  441. String ymdhm = dateFormats.get().ymdh + ":" + minute;
  442. SimpleDateFormat format = new SimpleDateFormat(ymdhm);
  443. return format.format(date);
  444. }
  445. /**
  446. * 获取几个月后的日期
  447. */
  448. public static Date getAfterMonth(Date inputDate, int number) {
  449. Calendar c = Calendar.getInstance();//获得一个日历的实例
  450. c.setTime(inputDate);//设置日历时间
  451. c.add(Calendar.MONTH, number);//在日历的月份上增加月
  452. return c.getTime();
  453. }
  454. /**
  455. * 计算当前月有多少天
  456. */
  457. public static int getDays(int year, int month) {
  458. int days = 0;
  459. if (month != 2) {
  460. switch (month) {
  461. case 1:
  462. case 3:
  463. case 5:
  464. case 7:
  465. case 8:
  466. case 10:
  467. case 12:
  468. days = 31;
  469. break;
  470. case 4:
  471. case 6:
  472. case 9:
  473. case 11:
  474. days = 30;
  475. }
  476. } else {
  477. // 闰年
  478. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
  479. days = 29;
  480. } else {
  481. days = 28;
  482. }
  483. }
  484. System.out.println("当月有" + days + "天!");
  485. return days;
  486. }
  487. public static Date getCurrYearFirst(){
  488. Calendar currCal=Calendar.getInstance();
  489. int currentYear = currCal.get(Calendar.YEAR);
  490. return getYearFirst(currentYear);
  491. }
  492. /**
  493. * 获取当年的最后一天
  494. * @param year
  495. * @return
  496. */
  497. public static Date getCurrYearLast(){
  498. Calendar currCal=Calendar.getInstance();
  499. int currentYear = currCal.get(Calendar.YEAR);
  500. return getYearLast(currentYear);
  501. }
  502. /**
  503. * 获取某年第一天日期
  504. * @param year 年份
  505. * @return Date
  506. */
  507. public static Date getYearFirst(int year){
  508. Calendar calendar = Calendar.getInstance();
  509. calendar.clear();
  510. calendar.set(Calendar.YEAR, year);
  511. Date currYearFirst = calendar.getTime();
  512. return currYearFirst;
  513. }
  514. /**
  515. * 获取某年最后一天日期
  516. * @param year 年份
  517. * @return Date
  518. */
  519. public static Date getYearLast(int year){
  520. Calendar calendar = Calendar.getInstance();
  521. calendar.clear();
  522. calendar.set(Calendar.YEAR, year);
  523. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  524. Date currYearLast = calendar.getTime();
  525. return currYearLast;
  526. }
  527. /**
  528. * 返回一年所有月份
  529. * @return
  530. */
  531. public static List<String> getMonth(){
  532. List<String> monthList = new ArrayList<>();
  533. Calendar date = Calendar.getInstance();
  534. String year = String.valueOf(date.get(Calendar.YEAR));
  535. for(int i=1;i<13;i++){
  536. if(i<10){
  537. monthList.add(year+"-0"+i+"");
  538. }else{
  539. monthList.add(year+"-"+i+"");
  540. }
  541. }
  542. return monthList;
  543. }
  544. public static String UTCtoCST(long sec){
  545. long utc = sec*1000L;
  546. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式按需自定义
  547. format.setTimeZone(TimeZone.getTimeZone("GMT+08")); //北京时区GMT+8
  548. return format.format(new Date(utc));
  549. }
  550. public static void main(String[] args) {
  551. System.out.println(UTCtoCST(1622510202));
  552. }
  553. }
  554. class DateFormats {
  555. public final SimpleDateFormat hms = new SimpleDateFormat("HH:mm:ss");
  556. public final SimpleDateFormat hm = new SimpleDateFormat("HH:mm");
  557. public final SimpleDateFormat ymdhm = new SimpleDateFormat("yyyy-MM-dd HH:mm:00");
  558. public final SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd");
  559. public final SimpleDateFormat ym = new SimpleDateFormat("yyyy-MM");
  560. public final SimpleDateFormat ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  561. public final SimpleDateFormat ymdChinese = new SimpleDateFormat("yyyy年MM月dd日");
  562. public final SimpleDateFormat ymdSlash = new SimpleDateFormat("yyyy/MM/dd");
  563. public final SimpleDateFormat ymdDigital = new SimpleDateFormat("yyyyMMdd");
  564. public final SimpleDateFormat ymdhmsDigital = new SimpleDateFormat("yyyyMMddHHmmss");
  565. public static final String ymdh = "yyyy-MM-dd HH";
  566. }