TimeTool.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. package com.shkpr.service.alambizplugin.commtools;
  2. import org.springframework.util.StringUtils;
  3. import java.text.SimpleDateFormat;
  4. import java.time.*;
  5. import java.time.format.DateTimeFormatter;
  6. import java.time.format.DateTimeParseException;
  7. import java.time.format.ResolverStyle;
  8. import java.util.ArrayList;
  9. import java.util.Calendar;
  10. import java.util.Date;
  11. import java.util.List;
  12. public class TimeTool {
  13. public static final long MS_HTTP_REQ_TIMEOUT = 120*1000; //两分钟的毫秒数
  14. public static final long MS_ONE_HALF_MIN = 90*1000; //一分半钟的毫秒数
  15. public static final long MS_ONE_MIN = 60*1000; //一分钟的毫秒数
  16. public static final long MIN_ONE_DAY = 24*60; //一天中的分
  17. public static final long SEC_ONE_DAY = 24*60*60; //一天中的秒
  18. public static final long MS_ONE_DAY = 24*60*60*1000; //一天中的毫秒
  19. public static final long MS_ONE_YEAR = 365*MS_ONE_DAY;//一年中的毫秒
  20. public static final long MS_ONE_HOUR = 60*60*1000; //一小时的毫秒
  21. public static final String YEAR_FORMAT = "yyyy";
  22. public static final String YEAR_MONTH_FORMAT_EX = "yyyyMM";
  23. public static final String YEAR_MONTH_FORMAT = "yyyy-MM";
  24. public static final String YEAR_MONTH_FORMAT_SLASH = "yyyy/MM";
  25. public static final String YEAR_MONTH_DAY_FORMAT = "yyyy-MM-dd";
  26. public static final String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss";
  27. public static final String TIMESTAMP_FORMAT_EX = "yyyy-MM-dd HH:mm:ss.SSS";
  28. public static final String TIMESTAMP_FORMAT_EX2 = "yyyyMMddHHmmss";
  29. public static final long UTC_MS_START_ONLINE = 1538323200000L;//2018-10-01 00:00:00
  30. public static volatile long UTC_MS_TODAY_BEGIN = 0L;
  31. public static volatile long UTC_MS_TODAY_END = 0L;
  32. public static volatile long UTC_MS_THIS_MONTH_BEGIN = 0L;
  33. public static volatile long UTC_MS_THIS_MONTH_END = 0L;
  34. private static final DateTimeFormatter TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT);
  35. private static final DateTimeFormatter TIMESTAMP_EX_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT_EX);
  36. private static final DateTimeFormatter TIMESTAMP_EX2_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT_EX2);
  37. private static final DateTimeFormatter YEAR_MONTH_FORMATTER = DateTimeFormatter.ofPattern(YEAR_MONTH_FORMAT);
  38. private static final DateTimeFormatter YEAR_MONTH_DAY_FORMATTER = DateTimeFormatter.ofPattern(YEAR_MONTH_DAY_FORMAT);
  39. public static void refreshUTCTimeRes(){
  40. UTC_MS_TODAY_BEGIN = getTodayBeginUTC();
  41. UTC_MS_TODAY_END = getTodayEndUTC();
  42. UTC_MS_THIS_MONTH_BEGIN = getMonthBeginUTC(System.currentTimeMillis());
  43. UTC_MS_THIS_MONTH_END = getMonthEndUTC(System.currentTimeMillis());
  44. }
  45. private static LocalDateTime strTime2LocalDateTime(String time, String format) {
  46. switch (format){
  47. case YEAR_MONTH_FORMAT:
  48. return LocalDateTime.parse(time, YEAR_MONTH_FORMATTER);
  49. case YEAR_MONTH_DAY_FORMAT:
  50. return LocalDateTime.parse(time, YEAR_MONTH_DAY_FORMATTER);
  51. case TIMESTAMP_FORMAT:
  52. return LocalDateTime.parse(time, TIMESTAMP_FORMATTER);
  53. case TIMESTAMP_FORMAT_EX:
  54. return LocalDateTime.parse(time, TIMESTAMP_EX_FORMATTER);
  55. case TIMESTAMP_FORMAT_EX2:
  56. return LocalDateTime.parse(time, TIMESTAMP_EX2_FORMATTER);
  57. default:
  58. return LocalDateTime.parse(time, DateTimeFormatter.ofPattern(format));
  59. }
  60. }
  61. private static String localDateTime2StrTime(LocalDateTime localDateTime, String format) {
  62. switch (format){
  63. case YEAR_MONTH_FORMAT:
  64. return localDateTime.format(YEAR_MONTH_FORMATTER);
  65. case YEAR_MONTH_DAY_FORMAT:
  66. return localDateTime.format(YEAR_MONTH_DAY_FORMATTER);
  67. case TIMESTAMP_FORMAT:
  68. return localDateTime.format(TIMESTAMP_FORMATTER);
  69. case TIMESTAMP_FORMAT_EX:
  70. return localDateTime.format(TIMESTAMP_EX_FORMATTER);
  71. case TIMESTAMP_FORMAT_EX2:
  72. return localDateTime.format(TIMESTAMP_EX2_FORMATTER);
  73. default:
  74. return localDateTime.format(DateTimeFormatter.ofPattern(format));
  75. }
  76. }
  77. private static LocalDateTime utcMsTime2LocalDateTime(long lUTC) {
  78. if (!isMsUTC(lUTC)){
  79. lUTC = lUTC*1000;
  80. }
  81. Instant instant = Instant.ofEpochMilli(lUTC);
  82. ZoneId zone = ZoneId.systemDefault();
  83. return LocalDateTime.ofInstant(instant, zone);
  84. }
  85. private static long localDateTime2UtcMsTime(LocalDateTime localDateTime) {
  86. ZoneId zone = ZoneId.systemDefault();
  87. Instant instant = localDateTime.atZone(zone).toInstant();
  88. return instant.toEpochMilli();
  89. }
  90. private static long strTime2UtcMsTime(String dateStr, String format){
  91. return localDateTime2UtcMsTime(strTime2LocalDateTime(dateStr, format));
  92. }
  93. private static String utcMsTime2StrTime(long lUTC, String format){
  94. return localDateTime2StrTime(utcMsTime2LocalDateTime(lUTC), format);
  95. }
  96. public static long convertDateStr2UTC(String dateStr){
  97. try {
  98. dateStr = dateStr.trim();
  99. int len = dateStr.length();
  100. if (len >= 23)
  101. return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT_EX);
  102. else if (len >= 19)
  103. return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT);
  104. else if (len >= 14)
  105. return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT_EX2);
  106. else if (len >= 10)//即dataStr为yyyy-MM-dd
  107. return strTime2UtcMsTime(String.format("%s 00:00:00", dateStr), TIMESTAMP_FORMAT);
  108. else if (len >= 7)//即dataStr为yyyy-MM
  109. return strTime2UtcMsTime(String.format("%s-01 00:00:00", dateStr), TIMESTAMP_FORMAT);
  110. else if (len >= 6)//即dataStr为yyyyMM
  111. return strTime2UtcMsTime(String.format("%s01000000", dateStr), TIMESTAMP_FORMAT_EX2);
  112. else if (len >= 4)//即dataStr为yyyy
  113. return strTime2UtcMsTime(String.format("%s-01-01 00:00:00", dateStr), TIMESTAMP_FORMAT);
  114. }catch (Exception e){}
  115. return 0L;
  116. }
  117. /**
  118. * 指定UTC是否为精确到毫秒的UTC时间
  119. * @param lUTC
  120. * @return
  121. */
  122. public static boolean isMsUTC(long lUTC){
  123. return lUTC > 10000000000L;
  124. }
  125. public static long getCurSecUTC(){
  126. return (System.currentTimeMillis()/1000)*1000;
  127. }
  128. public static long getCurMsUTC(){
  129. return System.currentTimeMillis();
  130. }
  131. /**
  132. *
  133. * @param lUTC UTC时间格式(单位:毫秒)
  134. * @param strDateFormat 日期格式模板:如:yyyy-MM-dd HH:mm:ss
  135. * @return
  136. */
  137. public static String convertUTC2DateStr(long lUTC, String strDateFormat){
  138. try {
  139. return utcMsTime2StrTime(lUTC<=0?System.currentTimeMillis():lUTC
  140. , StringUtils.isEmpty(strDateFormat)?TIMESTAMP_FORMAT:strDateFormat);
  141. }catch (Exception e){}
  142. return "";
  143. }
  144. /**
  145. * 从当前时间算起,还有多少毫秒今天将结束
  146. * @return 所剩的毫秒数
  147. */
  148. public static long hasMsWhenTodayEnd(){
  149. long lR = UTC_MS_TODAY_END+1-System.currentTimeMillis();
  150. if (lR <= 0)
  151. lR = 1;
  152. return lR;
  153. }
  154. /**
  155. * 获取过期时间
  156. * @param nSeconds 从当前时间算起,nSeconds秒后过期
  157. * @return UTC时间格式(单位:毫秒)
  158. */
  159. public static long createExpiredTime(long nSeconds){
  160. nSeconds = nSeconds<0?0:nSeconds;
  161. long nowMillis = System.currentTimeMillis();
  162. return nowMillis+(nSeconds*1000);
  163. }
  164. /**
  165. * 获取当天的开始时间
  166. * @return UTC时间格式(单位:毫秒)
  167. * 返回时间格式为:00:00:00.000所对应的时间戳
  168. */
  169. public static long getTodayBeginUTC(){
  170. return LocalDateTime.of(LocalDate.now(), LocalTime.MIN)
  171. .atZone(ZoneId.systemDefault())
  172. .toInstant()
  173. .toEpochMilli();
  174. /*Calendar todayStart = Calendar.getInstance();
  175. todayStart.set(Calendar.HOUR_OF_DAY, 0);
  176. todayStart.set(Calendar.MINUTE, 0);
  177. todayStart.set(Calendar.SECOND, 0);
  178. todayStart.set(Calendar.MILLISECOND, 0);
  179. return todayStart.getTime().getTime();*/
  180. }
  181. /**
  182. * 获取当天距离最近的整点时刻
  183. * @return UTC时间格式(单位:毫秒)
  184. * @return
  185. */
  186. public static long getTodayLastHourUTC(){
  187. return LocalDateTime.now().withMinute(0).withSecond(0).withNano(0)
  188. .atZone(ZoneId.systemDefault())
  189. .toInstant()
  190. .toEpochMilli();
  191. }
  192. /**
  193. * 获取指定时间当日的起始时刻(即00:00:00.000)
  194. * @param tmMS
  195. * @return
  196. */
  197. public static long getBeginUTCOfTime(long tmMS){
  198. if (!isMsUTC(tmMS)){
  199. tmMS = tmMS*1000;
  200. }
  201. LocalDateTime startOfDay = LocalDateTime.ofInstant(Instant.ofEpochMilli(tmMS), ZoneId.systemDefault()).with(LocalTime.MIN);
  202. return startOfDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  203. }
  204. /**
  205. * 获取指定时间当日的结束时刻(即23:59:59.999)
  206. * @param tmMS
  207. * @return
  208. */
  209. public static long getEndUTCOfTime(long tmMS){
  210. if (!isMsUTC(tmMS)){
  211. tmMS = tmMS*1000;
  212. }
  213. LocalDateTime startOfDay = LocalDateTime.ofInstant(Instant.ofEpochMilli(tmMS), ZoneId.systemDefault()).with(LocalTime.MAX);
  214. return startOfDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  215. }
  216. /**
  217. * 获取当天的结束时间
  218. * @return UTC时间格式(单位:毫秒)
  219. * 返回时间格式为:23:59:59.999所对应的时间戳
  220. */
  221. public static long getTodayEndUTC(){
  222. return LocalDateTime.of(LocalDate.now(), LocalTime.MAX)
  223. .atZone(ZoneId.systemDefault())
  224. .toInstant()
  225. .toEpochMilli();
  226. /*Calendar todayStart = Calendar.getInstance();
  227. todayStart.set(Calendar.HOUR_OF_DAY, 23);
  228. todayStart.set(Calendar.MINUTE, 59);
  229. todayStart.set(Calendar.SECOND, 59);
  230. todayStart.set(Calendar.MILLISECOND, 999);
  231. return todayStart.getTime().getTime();*/
  232. }
  233. /**
  234. * 获取当前时间所在月份的开始时间戳
  235. * @param curTime
  236. * @return UTC时间格式(单位:毫秒)
  237. * 返回时间格式为:xxxx-xx-01 00:00:00.000所对应的时间戳
  238. */
  239. public static long getMonthBeginUTC(long curTime){
  240. Calendar c = Calendar.getInstance();
  241. if (!isMsUTC(curTime))
  242. curTime = curTime*1000;
  243. try {
  244. c.setTime(new Date(curTime));
  245. c.set(Calendar.DAY_OF_MONTH, 1);
  246. c.set(Calendar.HOUR_OF_DAY, 0);
  247. c.set(Calendar.MINUTE, 0);
  248. c.set(Calendar.SECOND,0);
  249. c.set(Calendar.MILLISECOND, 0);
  250. return c.getTimeInMillis();
  251. }catch (Exception e){}
  252. return 0L;
  253. }
  254. /**
  255. * 获取当前时间所在月份的结束时间戳
  256. * @param curTime
  257. * @return UTC时间格式(单位:毫秒)
  258. * 返回时间格式为:xxxx-xx-31 23:59:59.999所对应的时间戳
  259. */
  260. public static long getMonthEndUTC(long curTime){
  261. Calendar c = Calendar.getInstance();
  262. if (!isMsUTC(curTime))
  263. curTime = curTime*1000;
  264. try {
  265. c.setTime(new Date(curTime));
  266. c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
  267. c.set(Calendar.HOUR_OF_DAY, 23);
  268. c.set(Calendar.MINUTE, 59);
  269. c.set(Calendar.SECOND,59);
  270. c.set(Calendar.MILLISECOND, 999);
  271. return c.getTimeInMillis();
  272. }catch (Exception e){}
  273. return 0L;
  274. }
  275. /**
  276. * 获取指定时间段内的所有月份列表
  277. * @param startTime 起始时间,UTC时间格式,秒或毫秒
  278. * @param endTime 结束时间,UTC时间格式,秒或毫秒
  279. * @return 月份字符串列表
  280. * ["2018-01", "2018-02"]
  281. */
  282. public static List<String> getMonthListBetween(long startTime, long endTime){
  283. ArrayList<String> arrMonth = new ArrayList<>();
  284. if (!isMsUTC(startTime))
  285. startTime = startTime*1000;
  286. if (!isMsUTC(endTime))
  287. endTime = endTime*1000;
  288. try{
  289. String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(startTime));
  290. String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(endTime));
  291. Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strStart);
  292. Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strEnd);
  293. Calendar dPos = Calendar.getInstance();
  294. dPos.setTime(dtStart); //设置日期起始时间
  295. while (dPos.getTime().before(dtEnd)) {
  296. arrMonth.add((new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(dPos.getTime()));
  297. dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
  298. }
  299. arrMonth.add(strEnd);
  300. }catch (Exception e){e.printStackTrace();}
  301. return arrMonth;
  302. }
  303. /**
  304. * 获取指定时间段内的所有月份列表
  305. * @param startTime 起始时间,UTC时间格式,秒或毫秒
  306. * @param endTime 结束时间,UTC时间格式,秒或毫秒
  307. * @return 月份字符串列表
  308. * ["201801", "201802"]
  309. */
  310. public static List<String> getMonthListBetweenEx(long startTime, long endTime){
  311. ArrayList<String> arrMonth = new ArrayList<>();
  312. if (!isMsUTC(startTime))
  313. startTime = startTime*1000;
  314. if (!isMsUTC(endTime))
  315. endTime = endTime*1000;
  316. try{
  317. String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(new Date(startTime));
  318. String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(new Date(endTime));
  319. Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).parse(strStart);
  320. Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).parse(strEnd);
  321. Calendar dPos = Calendar.getInstance();
  322. dPos.setTime(dtStart); //设置日期起始时间
  323. while (dPos.getTime().before(dtEnd)) {
  324. arrMonth.add((new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(dPos.getTime()));
  325. dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
  326. }
  327. arrMonth.add(strEnd);
  328. }catch (Exception e){e.printStackTrace();}
  329. return arrMonth;
  330. }
  331. /**
  332. * 获取指定时间段内的所有月份列表UTC
  333. * @param startTime 起始时间,UTC时间格式,秒或毫秒
  334. * @param endTime 结束时间,UTC时间格式,秒或毫秒
  335. * @return 月份UTC时间戳列表(精确到毫秒)
  336. * [2018-01-01 00:00:00.000对应的UTC, 2018-02-01 00:00:00.000对应的UTC]
  337. */
  338. public static List<Long> getMonthUTCListBetween(long startTime, long endTime){
  339. ArrayList<Long> arrMonth = new ArrayList<>();
  340. if (!isMsUTC(startTime))
  341. startTime = startTime*1000;
  342. if (!isMsUTC(endTime))
  343. endTime = endTime*1000;
  344. try{
  345. String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(startTime));
  346. String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(endTime));
  347. Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strStart);
  348. Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strEnd);
  349. Calendar dPos = Calendar.getInstance();
  350. dPos.setTime(dtStart); //设置日期起始时间
  351. while (dPos.getTime().before(dtEnd)) {
  352. arrMonth.add(dPos.getTimeInMillis());
  353. dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
  354. }
  355. arrMonth.add(dtEnd.getTime());
  356. }catch (Exception e){e.printStackTrace();}
  357. return arrMonth;
  358. }
  359. /**
  360. * 获取指定时间段内的所有月份列表
  361. * @param startTime 起始月份,如:2018-01-01 00:00:00
  362. * @param endTime 结束月份,如:2018-02-01 00:00:00
  363. * @return 月份字符串列表
  364. * ["2018-01", "2018-02"]
  365. */
  366. public static List<String> getMonthListBetween(String startTime, String endTime){
  367. try {
  368. //Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(startTime);
  369. //Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(endTime);
  370. return getMonthListBetween(convertDateStr2UTC(startTime), convertDateStr2UTC(endTime));
  371. }catch (Exception e){
  372. e.printStackTrace();
  373. }
  374. return null;
  375. }
  376. /**
  377. * 获取指定时间段内的所有月份列表
  378. * @param startTime 起始月份,如:2018-01-01 00:00:00
  379. * @param endTime 结束月份,如:2018-02-01 00:00:00
  380. * @return 月份字符串列表
  381. * ["201801", "201802"]
  382. */
  383. public static List<String> getMonthListBetweenEx(String startTime, String endTime){
  384. try {
  385. //Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT_EX).parse(startTime);
  386. //Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT_EX).parse(endTime);
  387. return getMonthListBetweenEx(convertDateStr2UTC(startTime), convertDateStr2UTC(endTime));
  388. }catch (Exception e){
  389. e.printStackTrace();
  390. }
  391. return null;
  392. }
  393. /**
  394. * 获取指定时间段内的所有月份列表UTC
  395. * @param startTime 起始月份,如:2018-01-01 00:00:00
  396. * @param endTime 结束月份,如:2018-02-01 00:00:00
  397. * @return 月份UTC时间戳列表(精确到秒)
  398. * [2018-01-01 00:00:00.000对应的UTC, 2018-02-01 00:00:00.000对应的UTC]
  399. */
  400. public static List<Long> getMonthUTCListBetween(String startTime, String endTime){
  401. try {
  402. Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(startTime);
  403. Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(endTime);
  404. return getMonthUTCListBetween(d1.getTime(), d2.getTime());
  405. }catch (Exception e){
  406. e.printStackTrace();
  407. }
  408. return null;
  409. }
  410. /**
  411. * yyyyMMddhhmmss时间字符串转yyyy-MM-dd HH:mm:ss时间字符串
  412. * @param strDateStr
  413. * @return
  414. */
  415. public static String addSplitForDateStr(String strDateStr){
  416. if (!StringUtils.isEmpty(strDateStr)){
  417. try {
  418. return localDateTime2StrTime(strTime2LocalDateTime(strDateStr, TIMESTAMP_FORMAT_EX2), TIMESTAMP_FORMAT);
  419. }catch (Exception e){}
  420. }
  421. return "";
  422. }
  423. /**
  424. * 修改指定时间的月份
  425. * @param curTime
  426. * @param month > 0 在指定时间上加数个月;< 0 在指定时间上减数个月;
  427. * @return
  428. */
  429. public static long getTimeChgMonth(long curTime, int month){
  430. if (month == 0)
  431. return curTime;
  432. Calendar c = Calendar.getInstance();
  433. if (!isMsUTC(curTime))
  434. curTime = curTime*1000;
  435. try {
  436. c.setTime(new Date(curTime));
  437. c.add(Calendar.MONTH, month);
  438. return c.getTimeInMillis();
  439. }catch (Exception e){}
  440. return 0L;
  441. }
  442. public static String convertDateObj2DateStr(Date dateObj, String strDateFormat){
  443. try {
  444. int len = strDateFormat.length();
  445. if (len >= 21)
  446. return new SimpleDateFormat(TIMESTAMP_FORMAT_EX).format(dateObj);
  447. else if (len >= 17)
  448. return new SimpleDateFormat(TIMESTAMP_FORMAT).format(dateObj);
  449. else if (len >= 12)
  450. return new SimpleDateFormat(TIMESTAMP_FORMAT_EX2).format(dateObj);
  451. else {
  452. int splitCounts = CommTool.totalCharCountsInStr(strDateFormat, '-');
  453. if (splitCounts <= 0)
  454. splitCounts = CommTool.totalCharCountsInStr(strDateFormat, '/');
  455. if (splitCounts >= 2)
  456. return new SimpleDateFormat(YEAR_MONTH_DAY_FORMAT).format(dateObj);
  457. else if (splitCounts >= 1)
  458. return new SimpleDateFormat(YEAR_MONTH_FORMAT).format(dateObj);
  459. else
  460. return new SimpleDateFormat(YEAR_MONTH_FORMAT_EX).format(dateObj);
  461. }
  462. }catch (Exception e){}
  463. return new SimpleDateFormat(YEAR_MONTH_DAY_FORMAT).format(dateObj);
  464. }
  465. public static boolean checkValidDate(String dateStr) {
  466. try {
  467. DateTimeFormatter formatter = DateTimeFormatter
  468. .ofPattern("uuuu-MM-dd")//使用 "uuuu" 避免年份解析歧义
  469. .withResolverStyle(ResolverStyle.STRICT);
  470. LocalDate.parse(dateStr, formatter);
  471. return true;
  472. } catch (DateTimeParseException e) {
  473. return false;
  474. }
  475. }
  476. }