DateUtils.java 59 KB

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