DateUtils.java 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604
  1. package org.jeecg.common.util;
  2. import org.jeecg.common.constant.SystemDateConstant;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.util.StringUtils;
  6. import java.beans.PropertyEditorSupport;
  7. import java.sql.Timestamp;
  8. import java.text.DateFormat;
  9. import java.text.ParseException;
  10. import java.text.SimpleDateFormat;
  11. import java.util.*;
  12. /**
  13. * 类描述:时间操作定义类
  14. *
  15. * @Author: 张代浩
  16. * @Date:2012-12-8 12:15:03
  17. * @Version 1.0
  18. */
  19. public class DateUtils extends PropertyEditorSupport {
  20. private static Logger logger = LoggerFactory.getLogger(DateUtils.class);
  21. public static ThreadLocal<SimpleDateFormat> date_sdf = new ThreadLocal<SimpleDateFormat>() {
  22. @Override
  23. protected SimpleDateFormat initialValue() {
  24. return new SimpleDateFormat("yyyy-MM-dd");
  25. }
  26. };
  27. public static ThreadLocal<SimpleDateFormat> yyyyMMdd = new ThreadLocal<SimpleDateFormat>() {
  28. @Override
  29. protected SimpleDateFormat initialValue() {
  30. return new SimpleDateFormat("yyyyMMdd");
  31. }
  32. };
  33. public static ThreadLocal<SimpleDateFormat> date_sdf_wz = new ThreadLocal<SimpleDateFormat>() {
  34. @Override
  35. protected SimpleDateFormat initialValue() {
  36. return new SimpleDateFormat("yyyy年MM月dd日");
  37. }
  38. };
  39. public static ThreadLocal<SimpleDateFormat> time_sdf = new ThreadLocal<SimpleDateFormat>() {
  40. @Override
  41. protected SimpleDateFormat initialValue() {
  42. return new SimpleDateFormat("yyyy-MM-dd HH:mm");
  43. }
  44. };
  45. public static ThreadLocal<SimpleDateFormat> yyyymmddhhmmss = new ThreadLocal<SimpleDateFormat>() {
  46. @Override
  47. protected SimpleDateFormat initialValue() {
  48. return new SimpleDateFormat("yyyyMMddHHmmss");
  49. }
  50. };
  51. public static ThreadLocal<SimpleDateFormat> short_time_sdf = new ThreadLocal<SimpleDateFormat>() {
  52. @Override
  53. protected SimpleDateFormat initialValue() {
  54. return new SimpleDateFormat("HH:mm");
  55. }
  56. };
  57. public static ThreadLocal<SimpleDateFormat> datetimeFormat = new ThreadLocal<SimpleDateFormat>() {
  58. @Override
  59. protected SimpleDateFormat initialValue() {
  60. return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  61. }
  62. };
  63. // 以毫秒表示的时间
  64. private static final long DAY_IN_MILLIS = 24 * 3600 * 1000L;
  65. private static final long HOUR_IN_MILLIS = 3600 * 1000L;
  66. private static final long MINUTE_IN_MILLIS = 60 * 1000L;
  67. private static final long SECOND_IN_MILLIS = 1000L;
  68. /**
  69. * 格式常量
  70. */
  71. public final static String SHORT_FORMAT = "yyyyMMdd";
  72. public final static String LONG_FORMAT = "yyyyMMddHHmmss";
  73. public final static String YEARHOUR_FORMAT = "yyyyMMddHH";
  74. public final static String WEB_FORMAT = "yyyy-MM-dd";
  75. public final static String TIME_FORMAT = "HHmmss";
  76. public final static String COLON_TIME_FORMAT = "HH:mm:ss";
  77. public final static String CHINESEDT_FORMAT = "yyyy年MM月dd日";
  78. public final static String NEW_FORMAT = "yyyy-MM-dd HH:mm:ss";
  79. public final static String WEB_FORMAT_ALL = "yyyy MM dd HH mm ss";
  80. public final static String SECOND_FORMAT = "yyyy-MM-dd HH";
  81. public final static String GREGORIAN_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
  82. public final static String NOMS_GREGORIAN_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
  83. public static String getNowHour(Date date) {
  84. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
  85. return simpleDateFormat.format(date);
  86. }
  87. public static Date getNowDate() throws ParseException {
  88. SimpleDateFormat dsdf = new SimpleDateFormat("yyyy-MM-dd");
  89. String nowDate = getNowDate("yyyy-MM-dd");
  90. return dsdf.parse(nowDate);
  91. }
  92. public static boolean compare(String beginDate, String nowDate) throws ParseException {
  93. //如果想比较日期则写成"yyyy-MM-dd"就可以了
  94. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  95. //将字符串形式的时间转化为Date类型的时间
  96. Date a = sdf.parse(beginDate);
  97. Date b = sdf.parse(nowDate);
  98. return a.before(b);
  99. }
  100. public static String getDateByDateStr(String dateStr) throws ParseException {
  101. SimpleDateFormat dsdf = new SimpleDateFormat("yyyy-MM-dd");
  102. Date parse = dsdf.parse(dateStr);
  103. return dsdf.format(parse);
  104. }
  105. public static Integer getHour(String dateStr) throws ParseException {
  106. DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  107. Calendar cal = Calendar.getInstance();
  108. Date date = sdf.parse(dateStr);
  109. cal.setTime(date);
  110. return cal.get(Calendar.HOUR_OF_DAY);
  111. }
  112. public static String getEndTime(String time) throws ParseException {
  113. SimpleDateFormat smf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  114. Date parse = smf.parse(time);
  115. Calendar calendar = Calendar.getInstance();
  116. calendar.setTime(parse);
  117. calendar.set(Calendar.HOUR_OF_DAY, 0);
  118. calendar.set(Calendar.MINUTE, 0);
  119. calendar.set(Calendar.SECOND, 0);
  120. calendar.add(Calendar.DAY_OF_MONTH, 1);
  121. calendar.add(Calendar.SECOND, -1);
  122. Date end = calendar.getTime();
  123. String format = smf.format(end);
  124. return format;
  125. }
  126. // 指定模式的时间格式
  127. private static SimpleDateFormat getSDFormat(String pattern) {
  128. return new SimpleDateFormat(pattern);
  129. }
  130. /**
  131. * 指定模式的时间格式
  132. *
  133. * @param pattern
  134. * @return
  135. */
  136. private static SimpleDateFormat getDateFormat(String pattern) {
  137. return new SimpleDateFormat(pattern);
  138. }
  139. /**
  140. * 日期转换为字符串
  141. *
  142. * @return 字符串
  143. */
  144. public static String date2Str() {
  145. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  146. return format.format(new Date());
  147. }
  148. public static List<Map<String, String>> getDateDayRange(String startDate, String endDate) throws ParseException {
  149. List<Map<String, String>> list = new ArrayList<>();
  150. String splitDate = DateUtils.addDay(endDate, -1);
  151. splitDate = DateUtils.addDay(splitDate, 1);
  152. if (DateUtils.compareDate(startDate, splitDate) >= 0) {
  153. Map<String, String> map = new HashMap<String, String>();
  154. map.put("startDate", startDate);
  155. map.put("endDate", endDate);
  156. list.add(map);
  157. } else {
  158. while (DateUtils.compareDate(startDate, splitDate) < 0 || DateUtils.compareDate(startDate, endDate) <= 0) {
  159. Map<String, String> map = new HashMap<>();
  160. map.put("startDate", splitDate);
  161. map.put("endDate", endDate);
  162. list.add(map);
  163. splitDate = DateUtils.addDay(splitDate, -1);
  164. endDate = DateUtils.addDay(endDate, -1);
  165. if (DateUtils.compareDate(startDate, splitDate) > 0) {
  166. splitDate = startDate;
  167. }
  168. }
  169. }
  170. return list;
  171. }
  172. /**
  173. * 当前日历,这里用中国时间表示
  174. *
  175. * @return 以当地时区表示的系统当前日历
  176. */
  177. public static Calendar getCalendar() {
  178. return Calendar.getInstance();
  179. }
  180. /**
  181. * 指定毫秒数表示的日历
  182. *
  183. * @param millis 毫秒数
  184. * @return 指定毫秒数表示的日历
  185. */
  186. public static Calendar getCalendar(long millis) {
  187. Calendar cal = Calendar.getInstance();
  188. cal.setTime(new Date(millis));
  189. return cal;
  190. }
  191. /**
  192. * 字符串转换成日期
  193. *
  194. * @param str
  195. * @param sdf
  196. * @return
  197. */
  198. public static Date str2Date(String str, SimpleDateFormat sdf) {
  199. if (null == str || "".equals(str)) {
  200. return null;
  201. }
  202. Date date = null;
  203. try {
  204. date = sdf.parse(str);
  205. return date;
  206. } catch (ParseException e) {
  207. e.printStackTrace();
  208. }
  209. return null;
  210. }
  211. /**
  212. * 当前日期
  213. *
  214. * @param l
  215. * @return 系统当前时间
  216. */
  217. public static Date getDate(long l) {
  218. return new Date();
  219. }
  220. public static String getStartTime(Date date) {
  221. Calendar dateStart = Calendar.getInstance();
  222. dateStart.setTime(date);
  223. dateStart.set(Calendar.HOUR_OF_DAY, 0);
  224. dateStart.set(Calendar.MINUTE, 0);
  225. dateStart.set(Calendar.SECOND, 0);
  226. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  227. return simpleDateFormat.format(dateStart.getTime());
  228. }
  229. /**
  230. * 日期转换为字符串
  231. *
  232. * @param date_sdf 日期格式
  233. * @return 字符串
  234. */
  235. public static String date2Str(SimpleDateFormat date_sdf) {
  236. Date date = getDate();
  237. if (null == date) {
  238. return null;
  239. }
  240. return date_sdf.format(date);
  241. }
  242. public static Date getDate() {
  243. return new Date();
  244. }
  245. /**
  246. * 格式化时间
  247. *
  248. * @param date
  249. * @param format
  250. * @return
  251. */
  252. public static String dateformat(String date, String format) {
  253. SimpleDateFormat sformat = new SimpleDateFormat(format);
  254. Date getDate = null;
  255. try {
  256. getDate = sformat.parse(date);
  257. } catch (ParseException e) {
  258. e.printStackTrace();
  259. }
  260. return sformat.format(getDate);
  261. }
  262. /**
  263. * 日期转换为字符串
  264. *
  265. * @param format 日期格式
  266. * @return 字符串
  267. */
  268. public static String getDate(String format) {
  269. Date date = new Date();
  270. SimpleDateFormat sdf = new SimpleDateFormat(format);
  271. return sdf.format(date);
  272. }
  273. /**
  274. * 指定毫秒数的时间戳
  275. *
  276. * @param millis 毫秒数
  277. * @return 指定毫秒数的时间戳
  278. */
  279. public static Timestamp getTimestamp(long millis) {
  280. return new Timestamp(millis);
  281. }
  282. /**
  283. * 以字符形式表示的时间戳
  284. *
  285. * @param time 毫秒数
  286. * @return 以字符形式表示的时间戳
  287. */
  288. public static Timestamp getTimestamp(String time) {
  289. return new Timestamp(Long.parseLong(time));
  290. }
  291. /**
  292. * 系统当前的时间戳
  293. *
  294. * @return 系统当前的时间戳
  295. */
  296. public static Timestamp getTimestamp() {
  297. return new Timestamp(System.currentTimeMillis());
  298. }
  299. /**
  300. * 当前时间,格式 yyyy-MM-dd HH:mm:ss
  301. *
  302. * @return 当前时间的标准形式字符串
  303. */
  304. public static String now() {
  305. return datetimeFormat.get().format(getCalendar().getTime());
  306. }
  307. /**
  308. * 指定日期的时间戳
  309. *
  310. * @param date 指定日期
  311. * @return 指定日期的时间戳
  312. */
  313. public static Timestamp getTimestamp(Date date) {
  314. return new Timestamp(date.getTime());
  315. }
  316. /**
  317. * 指定日历的时间戳
  318. *
  319. * @param cal 指定日历
  320. * @return 指定日历的时间戳
  321. */
  322. public static Timestamp getCalendarTimestamp(Calendar cal) {
  323. return new Timestamp(cal.getTime().getTime());
  324. }
  325. public static Timestamp gettimestamp() {
  326. Date dt = new Date();
  327. DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  328. String nowTime = df.format(dt);
  329. return Timestamp.valueOf(nowTime);
  330. }
  331. // ////////////////////////////////////////////////////////////////////////////
  332. // getMillis
  333. // 各种方式获取的Millis
  334. // ////////////////////////////////////////////////////////////////////////////
  335. /**
  336. * 系统时间的毫秒数
  337. *
  338. * @return 系统时间的毫秒数
  339. */
  340. public static long getMillis() {
  341. return System.currentTimeMillis();
  342. }
  343. /**
  344. * 指定日历的毫秒数
  345. *
  346. * @param cal 指定日历
  347. * @return 指定日历的毫秒数
  348. */
  349. public static long getMillis(Calendar cal) {
  350. return cal.getTime().getTime();
  351. }
  352. /**
  353. * 指定日期的毫秒数
  354. *
  355. * @param date 指定日期
  356. * @return 指定日期的毫秒数
  357. */
  358. public static long getMillis(Date date) {
  359. return date.getTime();
  360. }
  361. /**
  362. * 指定时间戳的毫秒数
  363. *
  364. * @param ts 指定时间戳
  365. * @return 指定时间戳的毫秒数
  366. */
  367. public static long getMillis(Timestamp ts) {
  368. return ts.getTime();
  369. }
  370. // ////////////////////////////////////////////////////////////////////////////
  371. // formatDate
  372. // 将日期按照一定的格式转化为字符串
  373. // ////////////////////////////////////////////////////////////////////////////
  374. /**
  375. * 默认方式表示的系统当前日期,具体格式:年-月-日
  376. *
  377. * @return 默认日期按“年-月-日“格式显示
  378. */
  379. public static String formatDate() {
  380. return date_sdf.get().format(getCalendar().getTime());
  381. }
  382. /**
  383. * 默认方式表示的系统当前日期,具体格式:yyyy-MM-dd HH:mm:ss
  384. *
  385. * @return 默认日期按“yyyy-MM-dd HH:mm:ss“格式显示
  386. */
  387. public static String formatDateTime() {
  388. return datetimeFormat.get().format(getCalendar().getTime());
  389. }
  390. /**
  391. * 获取时间字符串
  392. */
  393. public static String getDataString(SimpleDateFormat formatstr) {
  394. return formatstr.format(getCalendar().getTime());
  395. }
  396. /**
  397. * 指定日期的默认显示,具体格式:年-月-日
  398. *
  399. * @param cal 指定的日期
  400. * @return 指定日期按“年-月-日“格式显示
  401. */
  402. public static String formatDate(Calendar cal) {
  403. return date_sdf.get().format(cal.getTime());
  404. }
  405. /**
  406. * 指定日期的默认显示,具体格式:年-月-日
  407. *
  408. * @param date 指定的日期
  409. * @return 指定日期按“年-月-日“格式显示
  410. */
  411. public static String formatDate(Date date) {
  412. return date_sdf.get().format(date);
  413. }
  414. /**
  415. * 指定毫秒数表示日期的默认显示,具体格式:年-月-日
  416. *
  417. * @param millis 指定的毫秒数
  418. * @return 指定毫秒数表示日期按“年-月-日“格式显示
  419. */
  420. public static String formatDate(long millis) {
  421. return date_sdf.get().format(new Date(millis));
  422. }
  423. /**
  424. * 默认日期按指定格式显示
  425. *
  426. * @param pattern 指定的格式
  427. * @return 默认日期按指定格式显示
  428. */
  429. public static String formatDate(String pattern) {
  430. return getSDFormat(pattern).format(getCalendar().getTime());
  431. }
  432. /**
  433. * 指定日期按指定格式显示
  434. *
  435. * @param cal 指定的日期
  436. * @param pattern 指定的格式
  437. * @return 指定日期按指定格式显示
  438. */
  439. public static String formatDate(Calendar cal, String pattern) {
  440. return getSDFormat(pattern).format(cal.getTime());
  441. }
  442. /**
  443. * 指定日期按指定格式显示
  444. *
  445. * @param date 指定的日期
  446. * @param pattern 指定的格式
  447. * @return 指定日期按指定格式显示
  448. */
  449. public static String formatDate(Date date, String pattern) {
  450. return getSDFormat(pattern).format(date);
  451. }
  452. // ////////////////////////////////////////////////////////////////////////////
  453. // formatTime
  454. // 将日期按照一定的格式转化为字符串
  455. // ////////////////////////////////////////////////////////////////////////////
  456. /**
  457. * 默认方式表示的系统当前日期,具体格式:年-月-日 时:分
  458. *
  459. * @return 默认日期按“年-月-日 时:分“格式显示
  460. */
  461. public static String formatTime() {
  462. return time_sdf.get().format(getCalendar().getTime());
  463. }
  464. /**
  465. * 指定毫秒数表示日期的默认显示,具体格式:年-月-日 时:分
  466. *
  467. * @param millis 指定的毫秒数
  468. * @return 指定毫秒数表示日期按“年-月-日 时:分“格式显示
  469. */
  470. public static String formatTime(long millis) {
  471. return time_sdf.get().format(new Date(millis));
  472. }
  473. /**
  474. * 指定日期的默认显示,具体格式:年-月-日 时:分
  475. *
  476. * @param cal 指定的日期
  477. * @return 指定日期按“年-月-日 时:分“格式显示
  478. */
  479. public static String formatTime(Calendar cal) {
  480. return time_sdf.get().format(cal.getTime());
  481. }
  482. /**
  483. * 指定日期的默认显示,具体格式:年-月-日 时:分
  484. *
  485. * @param date 指定的日期
  486. * @return 指定日期按“年-月-日 时:分“格式显示
  487. */
  488. public static String formatTime(Date date) {
  489. return time_sdf.get().format(date);
  490. }
  491. // ////////////////////////////////////////////////////////////////////////////
  492. // formatShortTime
  493. // 将日期按照一定的格式转化为字符串
  494. // ////////////////////////////////////////////////////////////////////////////
  495. /**
  496. * 默认方式表示的系统当前日期,具体格式:时:分
  497. *
  498. * @return 默认日期按“时:分“格式显示
  499. */
  500. public static String formatShortTime() {
  501. return short_time_sdf.get().format(getCalendar().getTime());
  502. }
  503. /**
  504. * 指定毫秒数表示日期的默认显示,具体格式:时:分
  505. *
  506. * @param millis 指定的毫秒数
  507. * @return 指定毫秒数表示日期按“时:分“格式显示
  508. */
  509. public static String formatShortTime(long millis) {
  510. return short_time_sdf.get().format(new Date(millis));
  511. }
  512. /**
  513. * 指定日期的默认显示,具体格式:时:分
  514. *
  515. * @param cal 指定的日期
  516. * @return 指定日期按“时:分“格式显示
  517. */
  518. public static String formatShortTime(Calendar cal) {
  519. SimpleDateFormat shortTimeSdf = new SimpleDateFormat("HH:mm");
  520. return shortTimeSdf.format(cal.getTime());
  521. }
  522. /**
  523. * 指定日期的默认显示,具体格式:时:分
  524. *
  525. * @param date 指定的日期
  526. * @return 指定日期按“时:分“格式显示
  527. */
  528. public static String formatShortTime(Date date) {
  529. SimpleDateFormat shortTimeSdf = new SimpleDateFormat("HH:mm");
  530. return shortTimeSdf.format(date);
  531. }
  532. // ////////////////////////////////////////////////////////////////////////////
  533. // parseDate
  534. // parseCalendar
  535. // parseTimestamp
  536. // 将字符串按照一定的格式转化为日期或时间
  537. // ////////////////////////////////////////////////////////////////////////////
  538. /**
  539. * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间
  540. *
  541. * @param src 将要转换的原始字符窜
  542. * @param pattern 转换的匹配格式
  543. * @return 如果转换成功则返回转换后的日期
  544. * @throws ParseException
  545. * @throws
  546. */
  547. public static Date parseDate(String src, String pattern) {
  548. try {
  549. return getDateFormat(pattern).parse(src);
  550. } catch (ParseException e) {
  551. e.printStackTrace();
  552. return null;
  553. }
  554. }
  555. /**
  556. * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间
  557. *
  558. * @param src 将要转换的原始字符窜
  559. * @param pattern 转换的匹配格式
  560. * @return 如果转换成功则返回转换后的日期
  561. * @throws
  562. */
  563. public static Calendar parseCalendar(String src, String pattern) {
  564. Date date = parseDate(src, pattern);
  565. Calendar cal = Calendar.getInstance();
  566. cal.setTime(date);
  567. return cal;
  568. }
  569. public static String formatAddDate(String src, String pattern, int amount) {
  570. Calendar cal;
  571. cal = parseCalendar(src, pattern);
  572. cal.add(Calendar.DATE, amount);
  573. return formatDate(cal);
  574. }
  575. /**
  576. * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间
  577. *
  578. * @param src 将要转换的原始字符窜
  579. * @param pattern 转换的匹配格式
  580. * @return 如果转换成功则返回转换后的时间戳
  581. * @throws ParseException
  582. * @throws
  583. */
  584. public static Timestamp parseTimestamp(String src, String pattern) {
  585. Date date = parseDate(src, pattern);
  586. return new Timestamp(date.getTime());
  587. }
  588. // ////////////////////////////////////////////////////////////////////////////
  589. // dateDiff
  590. // 计算两个日期之间的差值
  591. // ////////////////////////////////////////////////////////////////////////////
  592. /**
  593. * 计算两个时间之间的差值,根据标志的不同而不同
  594. *
  595. * @param flag 计算标志,表示按照年/月/日/时/分/秒等计算
  596. * @param calSrc 减数
  597. * @param calDes 被减数
  598. * @return 两个日期之间的差值
  599. */
  600. public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) {
  601. long millisDiff = getMillis(calSrc) - getMillis(calDes);
  602. if (flag == 'y') {
  603. return (calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR));
  604. }
  605. if (flag == 'd') {
  606. return (int) (millisDiff / DAY_IN_MILLIS);
  607. }
  608. if (flag == 'h') {
  609. return (int) (millisDiff / HOUR_IN_MILLIS);
  610. }
  611. if (flag == 'm') {
  612. return (int) (millisDiff / MINUTE_IN_MILLIS);
  613. }
  614. if (flag == 's') {
  615. return (int) (millisDiff / SECOND_IN_MILLIS);
  616. }
  617. return 0;
  618. }
  619. public static String getDateString(String createTime) throws ParseException {
  620. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
  621. Date date = sdf1.parse(createTime);
  622. SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  623. return sdf2.format(date);
  624. }
  625. public static Map<String, Object> getStartEndTime(String createTime) throws ParseException {
  626. SimpleDateFormat smf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  627. Date parse = smf.parse(createTime);
  628. Calendar calendar = Calendar.getInstance();
  629. calendar.setTime(parse);
  630. calendar.set(Calendar.HOUR_OF_DAY, 0);
  631. calendar.set(Calendar.MINUTE, 0);
  632. calendar.set(Calendar.SECOND, 0);
  633. Date start = calendar.getTime();
  634. calendar.add(Calendar.DAY_OF_MONTH, 1);
  635. calendar.add(Calendar.SECOND, -1);
  636. Date end = calendar.getTime();
  637. Map<String, Object> map = new HashMap<>();
  638. map.put("start", smf.format(start));
  639. map.put("end", smf.format(end));
  640. return map;
  641. }
  642. public static String getQuarterStartDate(Date date) {
  643. Calendar calendar = new GregorianCalendar();
  644. calendar.setTime(date);
  645. Integer month = calendar.get(Calendar.MONTH);
  646. Integer compare = month % 3;
  647. calendar.add(Calendar.MONTH, -compare);
  648. calendar.set(Calendar.DAY_OF_MONTH, 1);
  649. Date getDate = calendar.getTime();
  650. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  651. return dateFormat.format(getDate);
  652. }
  653. public static String getQuarterEndDate(Date date) {
  654. Calendar calendar = new GregorianCalendar();
  655. calendar.setTime(date);
  656. Integer month = calendar.get(Calendar.MONTH);
  657. Integer compare = month % 3;
  658. calendar.add(Calendar.MONTH, (3 - compare));
  659. calendar.set(Calendar.DAY_OF_MONTH, 1);
  660. Date getDate = calendar.getTime();
  661. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  662. return dateFormat.format(getDate);
  663. }
  664. public static Date stampToTime(Long ms) throws ParseException {
  665. long msl = ms * 1000;
  666. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  667. Date temp = null;
  668. if (ms != null) {
  669. try {
  670. String str = sdf.format(msl);
  671. temp = sdf.parse(str);
  672. } catch (ParseException e) {
  673. e.printStackTrace();
  674. }
  675. }
  676. return temp;
  677. }
  678. private static Calendar zeroFromHour(long milliseconds) {
  679. Calendar calendar = Calendar.getInstance(); // 获得一个日历
  680. calendar.setTimeInMillis(completMilliseconds(milliseconds));
  681. zeroFromHour(calendar);
  682. return calendar;
  683. }
  684. private static long completMilliseconds(long milliseconds) {
  685. String milStr = Long.toString(milliseconds);
  686. if (milStr.length() == 10) {
  687. milliseconds = milliseconds * 1000;
  688. }
  689. return milliseconds;
  690. }
  691. private static void zeroFromHour(Calendar calendar) {
  692. calendar.set(Calendar.HOUR_OF_DAY, 0);
  693. calendar.set(Calendar.MINUTE, 0);
  694. calendar.set(Calendar.SECOND, 0);
  695. calendar.set(Calendar.MILLISECOND, 0);
  696. }
  697. public static String getWhatDay(long timeStamp) {
  698. Calendar cal = zeroFromHour(timeStamp);
  699. String whatDay = "";
  700. if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
  701. whatDay = "星期六";
  702. }
  703. if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
  704. whatDay = "星期日";
  705. }
  706. if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
  707. whatDay = "星期一";
  708. }
  709. if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY) {
  710. whatDay = "星期二";
  711. }
  712. if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY) {
  713. whatDay = "星期三";
  714. }
  715. if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
  716. whatDay = "星期四";
  717. }
  718. if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
  719. whatDay = "星期五";
  720. }
  721. return whatDay;
  722. }
  723. /* //日期转换为时间戳 */
  724. public static long timeToStamp(String timers) {
  725. Date d = new Date();
  726. long timeStemp = 0;
  727. try {
  728. SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  729. d = sf.parse(timers);// 日期转换为时间戳
  730. } catch (ParseException e) {
  731. e.printStackTrace();
  732. }
  733. timeStemp = d.getTime();
  734. return timeStemp / 1000;
  735. }
  736. public static int getdaysOfTwoDate(String minDate, String date) {
  737. Date bigDate = parseDate(date, "yyyy-MM-dd");
  738. Date smallDate = parseDate(minDate, "yyyy-MM-dd");
  739. int days = (int) ((bigDate.getTime() - smallDate.getTime()) / (1000 * 3600 * 24));
  740. return days + 1;
  741. }
  742. /**
  743. * 当前时间前推
  744. *
  745. * @param endDate
  746. * @param i
  747. * @return
  748. */
  749. public static Date addTime(Date endDate, int i) {
  750. Long time = Long.valueOf(i * 1000 * 60);
  751. Long time1 = endDate.getTime() - time;
  752. return new Date(time1);
  753. }
  754. /**
  755. * String类型 转换为Date, 如果参数长度为10 转换格式”yyyy-MM-dd“ 如果参数长度为19 转换格式”yyyy-MM-dd
  756. * HH:mm:ss“ * @param text String类型的时间值
  757. */
  758. @Override
  759. public void setAsText(String text) {
  760. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  761. SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  762. if (StringUtils.hasText(text)) {
  763. try {
  764. if (text.indexOf(":") == -1 && text.length() == 10) {
  765. setValue(format.parse(text));
  766. } else if (text.indexOf(":") > 0 && text.length() == 19) {
  767. setValue(datetimeFormat.parse(text));
  768. } else {
  769. throw new IllegalArgumentException("Could not parse date, date format is error ");
  770. }
  771. } catch (ParseException ex) {
  772. IllegalArgumentException iae = new IllegalArgumentException("Could not parse date: " + ex.getMessage());
  773. iae.initCause(ex);
  774. throw iae;
  775. }
  776. } else {
  777. setValue(null);
  778. }
  779. }
  780. public static int getYear(Date date) {
  781. GregorianCalendar calendar = new GregorianCalendar();
  782. calendar.setTime(date);
  783. return calendar.get(Calendar.YEAR);
  784. }
  785. public static Date timeStampToDate(Long time) {
  786. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  787. Date date;
  788. try {
  789. date = sdf.parse(sdf.format(time));
  790. return date;
  791. } catch (ParseException e) {
  792. e.printStackTrace();
  793. return null;
  794. }
  795. }
  796. public static List<Map<String, String>> getDateWeekRange(String startDate, String endDate) throws ParseException {
  797. List<Map<String, String>> list = new ArrayList<>();
  798. String splitDate = DateUtils.addWeek(endDate, -1);
  799. splitDate = DateUtils.addDay(splitDate, 1);
  800. if (DateUtils.compareDate(startDate, splitDate) >= 0) {
  801. Map<String, String> map = new HashMap<>();
  802. map.put("startDate", startDate);
  803. map.put("endDate", endDate);
  804. list.add(map);
  805. } else {
  806. while (DateUtils.compareDate(startDate, splitDate) < 0 || DateUtils.compareDate(startDate, endDate) <= 0) {
  807. Map<String, String> map = new HashMap<>();
  808. map.put("startDate", splitDate);
  809. map.put("endDate", endDate);
  810. list.add(map);
  811. splitDate = DateUtils.addWeek(splitDate, -1);
  812. endDate = DateUtils.addWeek(endDate, -1);
  813. if (DateUtils.compareDate(startDate, splitDate) > 0) {
  814. splitDate = startDate;
  815. }
  816. }
  817. }
  818. return list;
  819. }
  820. public static List<Map<String, String>> getDateMonthRange(String startDate, String endDate) throws ParseException {
  821. List<Map<String, String>> list = new ArrayList<>();
  822. String splitDate = DateUtils.addMonth(endDate, -1);
  823. splitDate = DateUtils.addDay(splitDate, 1);
  824. if (DateUtils.compareDate(startDate, splitDate) >= 0) {
  825. Map<String, String> map = new HashMap<>();
  826. map.put("startDate", startDate);
  827. map.put("endDate", endDate);
  828. list.add(map);
  829. } else {
  830. while (DateUtils.compareDate(startDate, splitDate) < 0 || DateUtils.compareDate(startDate, endDate) <= 0) {
  831. Map<String, String> map = new HashMap<>();
  832. map.put("startDate", splitDate);
  833. map.put("endDate", endDate);
  834. list.add(map);
  835. splitDate = DateUtils.addMonth(splitDate, -1);
  836. endDate = DateUtils.addMonth(endDate, -1);
  837. if (DateUtils.compareDate(startDate, splitDate) > 0) {
  838. splitDate = startDate;
  839. }
  840. }
  841. }
  842. return list;
  843. }
  844. public static String addMonth(String dateString, int month) throws ParseException {
  845. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  846. Date date = sdf.parse(dateString);
  847. Calendar calendar = Calendar.getInstance();
  848. calendar.setTime(date);
  849. calendar.add(Calendar.MONTH, month);
  850. return sdf.format(calendar.getTime());
  851. }
  852. public static String addWeek(String dateString, int week) throws ParseException {
  853. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  854. Date date = sdf.parse(dateString);
  855. Calendar calendar = Calendar.getInstance();
  856. calendar.setTime(date);
  857. calendar.add(Calendar.WEEK_OF_YEAR, week);
  858. return sdf.format(calendar.getTime());
  859. }
  860. public static String addDay(String dateString, int day) {
  861. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  862. Date date = null;
  863. try {
  864. date = sdf.parse(dateString);
  865. } catch (ParseException e) {
  866. e.printStackTrace();
  867. }
  868. Calendar calendar = Calendar.getInstance();
  869. calendar.setTime(date);
  870. calendar.add(Calendar.DAY_OF_YEAR, day);
  871. return sdf.format(calendar.getTime());
  872. }
  873. public static Date addDay(Date date, int day) {
  874. Calendar calendar = Calendar.getInstance();
  875. calendar.setTime(date);
  876. calendar.add(Calendar.DAY_OF_YEAR, day);
  877. return calendar.getTime();
  878. }
  879. public static Date addSecond(Date date, int seconds) {
  880. Calendar calendar = Calendar.getInstance();
  881. calendar.setTime(date);
  882. calendar.add(Calendar.SECOND, seconds);
  883. return calendar.getTime();
  884. }
  885. public static int compareDate(String firstDateString, String secondDateString) throws ParseException {
  886. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  887. Date firstDate = sdf.parse(firstDateString);
  888. Date secondDate = sdf.parse(secondDateString);
  889. long first = firstDate.getTime();
  890. long second = secondDate.getTime();
  891. return first == second ? 0 : (first > second ? 1 : -1);
  892. }
  893. public static String timeStamp2Date(Timestamp timeLong) {
  894. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  895. Date date;
  896. try {
  897. date = sdf.parse(sdf.format(timeLong));
  898. return sdf.format(date);
  899. } catch (ParseException e) {
  900. e.printStackTrace();
  901. return null;
  902. }
  903. }
  904. public static String timeStamp2Date(long currentTimeMillis) {
  905. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  906. Date date;
  907. try {
  908. date = sdf.parse(sdf.format(currentTimeMillis));
  909. return sdf.format(date);
  910. } catch (ParseException e) {
  911. e.printStackTrace();
  912. return null;
  913. }
  914. }
  915. public static Map<String, Object> getBeforeDate() {
  916. Date dNow = new Date();
  917. Calendar calendar = Calendar.getInstance();
  918. calendar.setTime(dNow);
  919. calendar.add(Calendar.DAY_OF_MONTH, -1);
  920. Date dBefore = calendar.getTime();
  921. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  922. String defaultStartDate = sdf.format(dBefore);
  923. defaultStartDate = defaultStartDate + " 00:00:00";
  924. String defaultEndDate = defaultStartDate.substring(0, 10) + " 23:59:59";
  925. Map<String, Object> map = new HashMap<>();
  926. map.put("startDate", defaultStartDate);
  927. map.put("endDate", defaultEndDate);
  928. return map;
  929. }
  930. /**
  931. * @param format 返回日期格式
  932. * @param date 传入的初始日期
  933. * @param num 天数
  934. * @return
  935. */
  936. public static String getAnotherDay(String format, String date, Integer num) {
  937. SimpleDateFormat sdf = new SimpleDateFormat(format);
  938. Date getDate = null;
  939. try {
  940. getDate = sdf.parse(date);
  941. } catch (ParseException e) {
  942. e.printStackTrace();
  943. }
  944. Calendar calendar = Calendar.getInstance();
  945. calendar.setTime(getDate);
  946. calendar.add(Calendar.DAY_OF_MONTH, num);
  947. Date resultDate = calendar.getTime();
  948. return sdf.format(resultDate);
  949. }
  950. public static String getNowDate(String format) {
  951. SimpleDateFormat sdf = new SimpleDateFormat(format);
  952. Date date = new Date();
  953. return sdf.format(date);
  954. }
  955. public static String getMonthBefore(String format, String nowTime, int amount) {
  956. // 获取当前时间
  957. SimpleDateFormat dateFormat = new SimpleDateFormat(format);
  958. Date date = null;
  959. try {
  960. date = dateFormat.parse(nowTime);
  961. } catch (ParseException e) {
  962. logger.error(e.getMessage(), e);
  963. }
  964. //得到日历
  965. Calendar calendar = Calendar.getInstance();
  966. //把当前时间赋给日历
  967. calendar.setTime(date);
  968. //设置为前2月,可根据需求进行修改
  969. calendar.add(Calendar.MONTH, amount);
  970. //获取2个月前的时间
  971. date = calendar.getTime();
  972. return dateFormat.format(date);
  973. }
  974. public static Map<String, Object> compareDate(String format, String date1, String date2) {
  975. DateFormat df = new SimpleDateFormat(format);
  976. Map<String, Object> map = new HashMap<>();
  977. try {
  978. Date dt1 = df.parse(date1);
  979. Date dt2 = df.parse(date2);
  980. if (dt1.getTime() > dt2.getTime()) {
  981. map.put("bigDate", date1);
  982. map.put("smallDate", date2);
  983. return map;
  984. } else if (dt1.getTime() < dt2.getTime()) {
  985. map.put("bigDate", date2);
  986. map.put("smallDate", date1);
  987. return map;
  988. }
  989. } catch (Exception exception) {
  990. exception.printStackTrace();
  991. }
  992. return null;
  993. }
  994. /**
  995. * 日期中获取年份
  996. *
  997. * @param format
  998. * @param date
  999. * @return
  1000. * @throws ParseException
  1001. */
  1002. public static String getYear(String format, String date) throws ParseException {
  1003. SimpleDateFormat df = new SimpleDateFormat(format);
  1004. Date parse = df.parse(date);
  1005. return String.format("%tY", parse);
  1006. }
  1007. /**
  1008. * 日期中获取月份
  1009. *
  1010. * @param format
  1011. * @param date
  1012. * @return
  1013. * @throws ParseException
  1014. */
  1015. public static String getMonth(String format, String date) throws ParseException {
  1016. SimpleDateFormat df = new SimpleDateFormat(format);
  1017. Date parse = df.parse(date);
  1018. return String.format("%tm", parse);
  1019. }
  1020. /**
  1021. * 日期中获取天
  1022. *
  1023. * @param format
  1024. * @param date
  1025. * @return
  1026. * @throws ParseException
  1027. */
  1028. public static String getDay(String format, String date) throws ParseException {
  1029. SimpleDateFormat df = new SimpleDateFormat(format);
  1030. Date parse = df.parse(date);
  1031. return String.format("%td", parse);
  1032. }
  1033. /**
  1034. * 根据时间获取季度
  1035. * 1即Q1(1,2,3月),以此类推
  1036. *
  1037. * @param date
  1038. * @return
  1039. */
  1040. public static int getQuarter(Date date) {
  1041. Calendar cal = Calendar.getInstance();
  1042. cal.setTime(date);
  1043. //获取当前月份
  1044. int month = cal.get(Calendar.MONTH) + 1;
  1045. if (month <= 3) {
  1046. return 1;
  1047. } else if (month <= 6) {
  1048. return 2;
  1049. } else if (month <= 9) {
  1050. return 3;
  1051. } else if (month <= 12) {
  1052. return 4;
  1053. }
  1054. return 0;
  1055. }
  1056. /**
  1057. * 获取【所在周】周五的时间(周五为一周第一天,周四为一周最后一天)
  1058. *
  1059. * @param date
  1060. */
  1061. public static Date getFriday(Date date) {
  1062. Calendar calendar = new GregorianCalendar();
  1063. calendar.setTime(date);
  1064. calendar.setFirstDayOfWeek(Calendar.FRIDAY);
  1065. calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
  1066. return calendar.getTime();
  1067. }
  1068. /**
  1069. * 获取传入时间的年、月份和季度(周五为每周第一天,周四为每周最后一天)
  1070. * 获取的是所属年、月、季度,因为很多月份的第一周或最后 一周会包括上一个月或者下一个月的部分日期
  1071. */
  1072. public static Map<String, Integer> getYearQuarter(Date date) {
  1073. Map<String, Integer> dateMap = new HashMap<>();
  1074. Calendar calendar = new GregorianCalendar();
  1075. calendar.setTime(date);
  1076. int originYear = calendar.get(Calendar.YEAR);
  1077. int originMonth = calendar.get(Calendar.MONTH);
  1078. //本月所在季度(按照日期来的)
  1079. int originQuarter = DateUtils.getQuarter(date);
  1080. Calendar calendar1 = new GregorianCalendar();
  1081. calendar1.setTime(date);
  1082. calendar1.setFirstDayOfWeek(Calendar.FRIDAY);
  1083. //1.判断当天所在周第一天是否跨月
  1084. calendar1.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
  1085. int fridayYear = calendar1.get(Calendar.YEAR);
  1086. int fridayMonth = calendar1.get(Calendar.MONTH);
  1087. int fridayQuarter = DateUtils.getQuarter(calendar1.getTime());
  1088. //2.判断当天所在周的最后一天是否跨月
  1089. Calendar calendar2 = new GregorianCalendar();
  1090. calendar2.setTime(date);
  1091. calendar2.setFirstDayOfWeek(Calendar.FRIDAY);
  1092. calendar2.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
  1093. int thursdayYear = calendar2.get(Calendar.YEAR);
  1094. int thursdayMonth = calendar2.get(Calendar.MONTH);
  1095. int thursdayQuarter = DateUtils.getQuarter(calendar2.getTime());
  1096. //如果本周第一天(周五)和当前天不在一个月内,说明周跨月了
  1097. if (fridayMonth == originMonth && thursdayMonth == originMonth) {
  1098. dateMap.put("year", originYear);
  1099. //最后一个月是11,应该+1
  1100. dateMap.put("month", originMonth + 1);
  1101. dateMap.put("quarter", originQuarter);
  1102. return dateMap;
  1103. } else if (fridayYear < originYear || (fridayYear == originYear && fridayMonth < originMonth)) {
  1104. //判断本周有几天在本月,如果是(5,6,7)则就是本月本季度
  1105. //int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
  1106. calendar1.set(Calendar.DATE, calendar1.getActualMaximum(Calendar.DATE));
  1107. int lastDateWeek = calendar1.get(Calendar.DAY_OF_WEEK);
  1108. //判断如果本周所在上个月的最后一天是周五、周六、周日的话,说明本周归属于本月(周五是第一天);否则本周归属于上个季度
  1109. if (lastDateWeek == 6 || lastDateWeek == 7 || lastDateWeek == 1) {
  1110. dateMap.put("year", originYear);
  1111. dateMap.put("month", originMonth + 1);
  1112. dateMap.put("quarter", originQuarter);
  1113. } else {
  1114. //判断如果本周属于上个月,判断是否跨年
  1115. if (originYear == fridayYear) {
  1116. dateMap.put("year", originYear);
  1117. dateMap.put("month", originMonth);
  1118. //判断是否跨季
  1119. if (originQuarter == fridayQuarter) {
  1120. dateMap.put("quarter", originQuarter);
  1121. } else {
  1122. dateMap.put("quarter", fridayQuarter);
  1123. }
  1124. } else {
  1125. //跨年的话说明这周上年的12月(第四季度)
  1126. dateMap.put("year", originYear - 1);
  1127. dateMap.put("month", 12); //??查看是11,还是12
  1128. dateMap.put("quarter", 4);
  1129. }
  1130. }
  1131. return dateMap;
  1132. } else if (originYear < thursdayYear || (originYear == thursdayYear && originMonth < thursdayMonth)) {
  1133. calendar2.set(Calendar.DATE, 1);
  1134. int firstDateWeek = calendar2.get(Calendar.DAY_OF_WEEK);
  1135. //如果跨月的第一天是周二周三周四的话说明这周不跨月,否在进入下个月(季度、年需要再判断)
  1136. if (firstDateWeek == 3 || firstDateWeek == 4 || firstDateWeek == 5) {
  1137. dateMap.put("year", originYear);
  1138. dateMap.put("month", originMonth + 1);
  1139. dateMap.put("quarter", originQuarter);
  1140. } else {
  1141. if (originYear == thursdayYear) {
  1142. dateMap.put("year", originYear);
  1143. dateMap.put("month", originMonth + 1 + 1);
  1144. //判断是否跨季
  1145. if (originQuarter == thursdayQuarter) {
  1146. dateMap.put("quarter", originQuarter);
  1147. } else {
  1148. dateMap.put("quarter", thursdayQuarter);
  1149. }
  1150. } else {
  1151. //跨年的话说明这周属于明年的1月(第一季度)
  1152. dateMap.put("year", originYear + 1);
  1153. dateMap.put("month", 1);
  1154. dateMap.put("quarter", 1);
  1155. }
  1156. }
  1157. return dateMap;
  1158. }
  1159. return dateMap;
  1160. }
  1161. /**
  1162. * 计算季度开始、结束时间
  1163. * 原则:周五为本周的第一天,下一周的周四为本周的最后一天
  1164. *
  1165. * @param year
  1166. * @param quarter
  1167. */
  1168. public static Map<String, String> quarterStartEndDate(int year, int quarter) {
  1169. Map<String, String> quarterStartEndDateMap = new HashMap<>();
  1170. Date startDate = null;
  1171. Date endDate = null;
  1172. int startMonth = 0;
  1173. int endMonth = 0;
  1174. if (quarter == 1) {
  1175. startMonth = 1;
  1176. endMonth = 3;
  1177. } else if (quarter == 2) {
  1178. startMonth = 4;
  1179. endMonth = 6;
  1180. } else if (quarter == 3) {
  1181. startMonth = 7;
  1182. endMonth = 9;
  1183. } else {
  1184. startMonth = 10;
  1185. endMonth = 12;
  1186. }
  1187. //判断季度第一天的时间(以周为单位,有可能是上个月,也有可能是本月的非1号)
  1188. Calendar calendar1 = new GregorianCalendar();
  1189. calendar1.set(Calendar.YEAR, year);
  1190. calendar1.set(Calendar.MONTH, startMonth - 1);
  1191. calendar1.set(Calendar.DATE, 1);
  1192. calendar1.setFirstDayOfWeek(Calendar.FRIDAY);
  1193. //如果季度第一个月的第一天是周二周三周四,那么这周应该归属于上个季度,否则这周(包括上个月的时间)归属于这个季度
  1194. int firstDateWeek = calendar1.get(Calendar.DAY_OF_WEEK);
  1195. if (firstDateWeek == 5 || firstDateWeek == 3 || firstDateWeek == 4) {
  1196. calendar1.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
  1197. startDate = DateUtils.addDay(calendar1.getTime(), 1);
  1198. } else {
  1199. calendar1.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
  1200. startDate = calendar1.getTime();
  1201. }
  1202. //判断季度最后一天的时间(以周为单位,有可能是下个月,也有可能是本月的非最后一天)
  1203. Calendar calendar2 = new GregorianCalendar();
  1204. calendar2.set(Calendar.YEAR, year);
  1205. calendar2.set(Calendar.MONTH, endMonth - 1);
  1206. calendar2.set(Calendar.DATE, 1);
  1207. calendar2.setFirstDayOfWeek(Calendar.FRIDAY);
  1208. //如果一个季度最后一个月最后一天是周五、周六、周日,则这个月最后一周属于下个季度
  1209. calendar2.set(Calendar.DATE, calendar2.getActualMaximum(Calendar.DATE));
  1210. int lastDateWeek = calendar2.get(Calendar.DAY_OF_WEEK);
  1211. if (lastDateWeek == 1 || lastDateWeek == 7 || lastDateWeek == 6) {
  1212. calendar2.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
  1213. endDate = DateUtils.addDay(calendar2.getTime(), -1);
  1214. } else {
  1215. calendar2.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
  1216. endDate = calendar2.getTime();
  1217. }
  1218. DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  1219. quarterStartEndDateMap.put("startDate", sdf.format(startDate));
  1220. quarterStartEndDateMap.put("endDate", sdf.format(endDate));
  1221. return quarterStartEndDateMap;
  1222. }
  1223. /**
  1224. * 获取上个季度的年度和季度数
  1225. *
  1226. * @param date
  1227. * @return
  1228. */
  1229. public static Map<String, Integer> lastQuarter(Date date) {
  1230. Map<String, Integer> resultMap = new HashMap<>();
  1231. //获取当天所在
  1232. Map<String, Integer> yearQuarter = getYearQuarter(date);
  1233. Integer year = yearQuarter.get("year");
  1234. Integer quarter = yearQuarter.get("quarter");
  1235. Integer lastyear = 0;
  1236. Integer lastQuarter = 0;
  1237. if (quarter == 4 || quarter == 3 || quarter == 2) {
  1238. lastyear = year;
  1239. lastQuarter = quarter - 1;
  1240. } else {
  1241. lastyear = year - 1;
  1242. lastQuarter = 4;
  1243. }
  1244. resultMap.put("year", lastyear);
  1245. resultMap.put("quarter", lastQuarter);
  1246. return resultMap;
  1247. }
  1248. /***
  1249. * 两日期之间相差天数
  1250. * @param dateStart
  1251. * @param dateEnd
  1252. * @return
  1253. */
  1254. public static long getDiscrepantDays(String dateStart, String dateEnd) {
  1255. //设置转换的日期格式
  1256. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  1257. //结束时间
  1258. Date startDate = null;
  1259. Date endDate = null;
  1260. try {
  1261. //开始时间
  1262. startDate = sdf.parse(dateStart);
  1263. endDate = sdf.parse(dateEnd);
  1264. } catch (ParseException e) {
  1265. e.printStackTrace();
  1266. }
  1267. //得到相差的天数 betweenDate
  1268. return (endDate.getTime() - startDate.getTime()) / (60 * 60 * 24 * 1000);
  1269. }
  1270. /***
  1271. * 两个日期之间间隔的月数(不考虑日期的情况)
  1272. */
  1273. public static int calDiffMonth(Date start, Date end) {
  1274. GregorianCalendar startCalendar = new GregorianCalendar();
  1275. startCalendar.setTime(start);
  1276. GregorianCalendar endCalendar = new GregorianCalendar();
  1277. endCalendar.setTime(end);
  1278. int startYear = startCalendar.get(Calendar.YEAR);
  1279. int startMonth = startCalendar.get(Calendar.MONTH) + 1;
  1280. int endYear = endCalendar.get(Calendar.YEAR);
  1281. int endMonth = endCalendar.get(Calendar.MONTH) + 1;
  1282. return (endYear - startYear) * 12 + (endMonth - startMonth);
  1283. }
  1284. public static int getDaysOfMonth(int year, int month) {
  1285. Calendar calendar = Calendar.getInstance();
  1286. calendar.set(year, month - 1, 1);
  1287. return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
  1288. }
  1289. public static int getFirstDateOfMonth(int year, int month) {
  1290. Calendar calendar = Calendar.getInstance();
  1291. calendar.set(year, month - 1, 1);
  1292. return calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
  1293. }
  1294. /**
  1295. * 获取指定日期下个月的第一天
  1296. *
  1297. * @param dateStr
  1298. * @param format
  1299. * @return
  1300. */
  1301. public static Map<String, String> getMaxMinDaysOfAddMonth(String dateStr, String format, int addMonth) {
  1302. SimpleDateFormat sdf = new SimpleDateFormat(format);
  1303. Map<String, String> dateMap = new HashMap<>();
  1304. try {
  1305. Date date = sdf.parse(dateStr);
  1306. Calendar calendar = Calendar.getInstance();
  1307. calendar.setTime(date);
  1308. calendar.add(Calendar.MONTH, addMonth);
  1309. calendar.set(Calendar.DAY_OF_MONTH, 1);
  1310. dateMap.put("startDate", sdf.format(calendar.getTime()));
  1311. calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DATE));
  1312. dateMap.put("endDate", sdf.format(calendar.getTime()));
  1313. return dateMap;
  1314. } catch (ParseException e) {
  1315. e.printStackTrace();
  1316. }
  1317. return null;
  1318. }
  1319. public static int dateDiff(String start, String end) {
  1320. //设置转换的日期格式
  1321. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  1322. //开始时间
  1323. Date startDate = null;
  1324. Date endDate = null;
  1325. try {
  1326. startDate = sdf.parse(start);
  1327. endDate = sdf.parse(end);
  1328. } catch (ParseException e) {
  1329. e.printStackTrace();
  1330. }
  1331. //得到相差的天数 betweenDate
  1332. long betweenDate = (endDate.getTime() - startDate.getTime()) / (60 * 60 * 24 * 1000);
  1333. return (int) betweenDate;
  1334. }
  1335. /**
  1336. * 判断两个日期间隔是否大于半年
  1337. *
  1338. * @return
  1339. */
  1340. public static boolean isMoreSixMonth(String startDate, String endDate) throws ParseException {
  1341. Calendar c = Calendar.getInstance();
  1342. c.setTime(Objects.requireNonNull(parseDate(startDate, SystemDateConstant.yyyy_MM_dd)));
  1343. long time1 = c.getTimeInMillis();
  1344. c.setTime(Objects.requireNonNull(parseDate(endDate, SystemDateConstant.yyyy_MM_dd)));
  1345. long time2 = c.getTimeInMillis();
  1346. long betweenDays = (time2 - time1) / (1000 * 3600 * 24);
  1347. int day = Integer.parseInt(String.valueOf(betweenDays));
  1348. return day > 180;
  1349. }
  1350. public static List<Date> findDates(Date dBegin, Date dEnd) {
  1351. List<Date> lDate = new ArrayList<>();
  1352. lDate.add(dBegin);
  1353. Calendar calBegin = Calendar.getInstance();
  1354. // 使用给定的 Date 设置此 Calendar 的时间
  1355. calBegin.setTime(dBegin);
  1356. Calendar calEnd = Calendar.getInstance();
  1357. // 使用给定的 Date 设置此 Calendar 的时间
  1358. calEnd.setTime(dEnd);
  1359. // 测试此日期是否在指定日期之后
  1360. while (dEnd.after(calBegin.getTime())) {
  1361. // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
  1362. calBegin.add(Calendar.DAY_OF_MONTH, 1);
  1363. lDate.add(calBegin.getTime());
  1364. }
  1365. return lDate;
  1366. }
  1367. /**
  1368. * 以time为节点,获取前几天的日期 yyyy-MM-dd
  1369. *
  1370. * @param
  1371. * @return java.lang.String
  1372. * @throws
  1373. * @author ZHAOXA
  1374. */
  1375. public static String getLastDay(String time, int days) {
  1376. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  1377. Calendar calendar = Calendar.getInstance();
  1378. Date date = null;
  1379. try {
  1380. date = sdf.parse(time);
  1381. } catch (ParseException e) {
  1382. e.printStackTrace();
  1383. }
  1384. calendar.setTime(date);
  1385. int day = calendar.get(Calendar.DATE);
  1386. // 此处修改为+1则是获取后一天
  1387. calendar.set(Calendar.DATE, day - days);
  1388. String lastDay = sdf.format(calendar.getTime());
  1389. return lastDay;
  1390. }
  1391. /**
  1392. * 获取当月1号零时零分的时间
  1393. *
  1394. * @param
  1395. * @return java.lang.String
  1396. * @throws
  1397. * @author ZHAOXA
  1398. */
  1399. public static String initDateByMonth() {
  1400. Calendar calendar = Calendar.getInstance();
  1401. calendar.setTime(new Date());
  1402. calendar.set(Calendar.DAY_OF_MONTH, 1);
  1403. calendar.set(Calendar.HOUR_OF_DAY, 0);
  1404. calendar.set(Calendar.MINUTE, 0);
  1405. calendar.set(Calendar.SECOND, 0);
  1406. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1407. return sdf.format(calendar.getTime());
  1408. }
  1409. /**
  1410. * 获取两个日期之间的所有日期集合
  1411. * @author ZHAOXA
  1412. * @param
  1413. * @return java.util.List<java.lang.String>
  1414. * @throws
  1415. */
  1416. public static List<String> getDays(String startTime, String endTime) {
  1417. // 返回的日期集合
  1418. List<String> days = new ArrayList<String>();
  1419. DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  1420. try {
  1421. Date start = dateFormat.parse(startTime);
  1422. Date end = dateFormat.parse(endTime);
  1423. Calendar tempStart = Calendar.getInstance();
  1424. tempStart.setTime(start);
  1425. Calendar tempEnd = Calendar.getInstance();
  1426. tempEnd.setTime(end);
  1427. tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
  1428. while (tempStart.before(tempEnd)) {
  1429. days.add(dateFormat.format(tempStart.getTime()));
  1430. tempStart.add(Calendar.DAY_OF_YEAR, 1);
  1431. }
  1432. } catch (ParseException e) {
  1433. e.printStackTrace();
  1434. }
  1435. return days;
  1436. }
  1437. }