DateUtils.java 59 KB

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