DateUtils.java 46 KB

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