DateUtils.java 56 KB

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