DateUtils.java 53 KB

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