DateUtils.java 58 KB

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