DateUtil.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. package com.happy.Until;
  2. import java.io.File;
  3. import java.text.DateFormat;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.List;
  10. import java.util.regex.Pattern;
  11. /**
  12. * @author xieli
  13. * @date 2023/8/1 17:34
  14. * @description 时间工具类
  15. */
  16. public class DateUtil
  17. {
  18. public DateUtil() {
  19. }
  20. public static String Time_Formatter_Day = "yyyy/MM/dd";
  21. public static String Time_Formatter_Second = "yyyy-MM-dd HH:mm:ss";
  22. public static String getCurrentYear() {
  23. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  24. Date date = new Date();
  25. return sdf.format(date);
  26. }
  27. /**
  28. * 判断 firstDate 是否在 secondDate 之前或相等.
  29. * @param firstDate .
  30. * @param secondDate .
  31. * @return firstDate 在 secondDate 之前或相等时返回 true,否则返回 false.
  32. */
  33. public static boolean isBeforeOrEqual(Date firstDate, Date secondDate) {
  34. if (secondDate == null) {
  35. return true;
  36. }
  37. if (firstDate.compareTo(secondDate) <= 0) {
  38. return true;
  39. }
  40. return false;
  41. }
  42. /**
  43. * 比较日期
  44. * @param firstDate 第一个
  45. * @param secondDate 第二个
  46. * @return boolean
  47. */
  48. public static boolean isAfterOrEqual(Date firstDate, Date secondDate) {
  49. if (secondDate == null) {
  50. return true;
  51. }
  52. if (firstDate.compareTo(secondDate) >= 0) {
  53. return true;
  54. }
  55. return false;
  56. }
  57. /**
  58. * 验证日期格式是否正确.
  59. * @param datestr .
  60. * @return .
  61. */
  62. public static boolean isISO8601Date(String datestr) {
  63. return Pattern
  64. .compile(
  65. "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$")
  66. .matcher(datestr).matches();
  67. }
  68. /**
  69. * 获取两个指定日期相差的天数.
  70. * @param firstDate .
  71. * @param secondDate .
  72. * @return .
  73. */
  74. public static int getBetweenDay(Date firstDate, Date secondDate) {
  75. // 时间格式相同,获取两时间差的秒数
  76. long betweendDateBySeconds = firstDate.getTime() - secondDate.getTime();
  77. // 得到天数(保持正负号)
  78. return (int) (betweendDateBySeconds / (1000 * 3600 * 24));
  79. }
  80. /**
  81. * 获取系统当前时间.
  82. * @return .
  83. */
  84. public static Date getCurrentDate() {
  85. return new Date();
  86. }
  87. /**
  88. * 年份
  89. * @param datIn 日期
  90. * @return int
  91. */
  92. public static int getYear(Date datIn) {
  93. Calendar calendar = Calendar.getInstance();
  94. calendar.setTime(datIn);
  95. return calendar.get(Calendar.YEAR);
  96. }
  97. /**
  98. * 月份
  99. * @param datIn 日期
  100. * @return int
  101. */
  102. public static int getMonth(Date datIn) {
  103. Calendar calendar = Calendar.getInstance();
  104. calendar.setTime(datIn);
  105. return calendar.get(Calendar.MONTH) + 1;
  106. }
  107. /**
  108. * 日
  109. * @param datIn 日期
  110. * @return int
  111. */
  112. public static int getDay(Date datIn) {
  113. Calendar calendar = Calendar.getInstance();
  114. calendar.setTime(datIn);
  115. return calendar.get(Calendar.DAY_OF_MONTH);
  116. }
  117. /**
  118. * 小时
  119. * @param datIn 日期
  120. * @return int
  121. */
  122. public static int getHour(Date datIn) {
  123. Calendar calendar = Calendar.getInstance();
  124. calendar.setTime(datIn);
  125. return calendar.get(Calendar.HOUR_OF_DAY);
  126. }
  127. /**
  128. * 分钟
  129. * @param datIn 日期
  130. * @return int
  131. */
  132. public static int getMinute(Date datIn) {
  133. Calendar calendar = Calendar.getInstance();
  134. calendar.setTime(datIn);
  135. return calendar.get(Calendar.MINUTE);
  136. }
  137. /**
  138. * 秒数
  139. * @param datIn 日期
  140. * @return int
  141. */
  142. public static int getSecond(Date datIn) {
  143. Calendar calendar = Calendar.getInstance();
  144. calendar.setTime(datIn);
  145. return calendar.get(Calendar.SECOND);
  146. }
  147. /**
  148. * 格式化日期
  149. * @param patern 格式字符
  150. * @return String
  151. */
  152. public static String getFormatDate(String patern) {
  153. return new SimpleDateFormat(patern).format(new Date());
  154. }
  155. /**
  156. * 格式化日期
  157. * @param datIn 日期
  158. * @return String
  159. */
  160. public static String getFormatPaternDate(Date datIn) {
  161. return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(datIn);
  162. }
  163. /**
  164. * 将指定字符串,通过指定格式转换为日期对象.
  165. * @param dateStr 字符串
  166. * @return Date
  167. */
  168. public static Date parseDate(String dateStr, String formatter) {
  169. try {
  170. if (Func.checkNullOrEmpty(dateStr)) {
  171. return null;
  172. }
  173. return new SimpleDateFormat(formatter).parse(dateStr);
  174. } catch (ParseException e) {
  175. return null;
  176. }
  177. }
  178. /**
  179. * 将指定字符串,通过指定格式转换为日期对象.
  180. * @param dateStr 字符串
  181. * @return Date
  182. */
  183. public static Date parseDateOnly(String dateStr) {
  184. if (Func.checkNullOrEmpty(dateStr)) {
  185. return null;
  186. }
  187. try {
  188. return new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
  189. } catch (ParseException e) {
  190. try {
  191. return new SimpleDateFormat("yyyy/MM/dd").parse(dateStr);
  192. } catch (Exception e2) {
  193. new Exception("时间格式错误:" + e2.getMessage()).printStackTrace();
  194. }
  195. }
  196. return null;
  197. }
  198. /**
  199. * 将日期date转化成string
  200. * @param date
  201. * @return
  202. */
  203. public static String parseDateToStr(Date date, String formatter) {
  204. SimpleDateFormat sdf = new SimpleDateFormat(formatter);
  205. return sdf.format(date);
  206. }
  207. /**
  208. * 增加日期
  209. * @param date 日期
  210. * @param dateField 字段
  211. * @param dateAmount 数量
  212. * @return Date
  213. */
  214. public static Date addDate(Date date, int dateField, int dateAmount) {
  215. Calendar calendar = Calendar.getInstance();
  216. calendar.setTime(date);
  217. calendar.add(dateField, dateAmount);
  218. return calendar.getTime();
  219. }
  220. /**
  221. * 格式化指定日期格式
  222. * @param datIn 日期内容
  223. * @param formatStr 格式化字符
  224. * @return 格式化之后的日期对象
  225. * @throws ParseException 转换异常
  226. */
  227. public static Date formateDate(Date datIn, String formatStr) throws ParseException {
  228. String dateStr = new SimpleDateFormat(formatStr).format(datIn);
  229. return new SimpleDateFormat(formatStr).parse(dateStr);
  230. }
  231. /**
  232. * 获取两个日期相差的月数
  233. * @param c1 较大的日期
  234. * @param c2 较小的日期
  235. * @return 如果d1>d2返回 月数差 否则返回0
  236. */
  237. public static int getMonthDiff(Calendar c1, Calendar c2) {
  238. if (c1.getTimeInMillis() < c2.getTimeInMillis()) {
  239. return 0;
  240. }
  241. int year1 = c1.get(Calendar.YEAR);
  242. int year2 = c2.get(Calendar.YEAR);
  243. int month1 = c1.get(Calendar.MONTH);
  244. int month2 = c2.get(Calendar.MONTH);
  245. int day1 = c1.get(Calendar.DAY_OF_MONTH);
  246. int day2 = c2.get(Calendar.DAY_OF_MONTH);
  247. // 获取年的差值 假设 d1 = 2015-8-16 d2 = 2011-9-30
  248. int yearInterval = year1 - year2;
  249. // 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数
  250. if (month1 < month2 || month1 == month2 && day1 < day2) {
  251. yearInterval--;
  252. }
  253. // 获取月数差值
  254. int monthInterval = (month1 + 12) - month2;
  255. if (day1 < day2) {
  256. monthInterval--;
  257. }
  258. monthInterval %= 12;
  259. return yearInterval * 12 + monthInterval;
  260. }
  261. /**
  262. * 获得两个日期之间的所有月份
  263. * @param minDate minDate
  264. * @param maxDate maxDate
  265. * @return List<String>
  266. * @throws ParseException ParseException
  267. */
  268. public static List<String> getMonthBetween(String minDate, String maxDate) throws ParseException {
  269. ArrayList<String> result = new ArrayList<String>();
  270. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");//格式化为年月
  271. Calendar min = Calendar.getInstance();
  272. Calendar max = Calendar.getInstance();
  273. min.setTime(sdf.parse(minDate));
  274. min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
  275. max.setTime(sdf.parse(maxDate));
  276. max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
  277. Calendar curr = min;
  278. while (curr.before(max)) {
  279. result.add(sdf.format(curr.getTime()));
  280. curr.add(Calendar.MONTH, 1);
  281. }
  282. return result;
  283. }
  284. /**
  285. * 转换日期
  286. * @param str 对象
  287. * @return boolean
  288. */
  289. @SuppressWarnings("deprecation")
  290. public static boolean isDateStr(String str, boolean hasDay) {
  291. boolean convertSuccess = true;
  292. // 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
  293. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
  294. if (!hasDay) {
  295. format = new SimpleDateFormat("yyyy/MM");
  296. }
  297. try {
  298. // 设置lenient为false.
  299. // 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
  300. format.setLenient(false);
  301. format.parse(str);
  302. } catch (ParseException e) {
  303. try {
  304. SimpleDateFormat formatt = new SimpleDateFormat("yyyy-MM-dd");
  305. if (!hasDay) {
  306. formatt = new SimpleDateFormat("yyyy-MM");
  307. }
  308. formatt.setLenient(false);
  309. Date tempDate = formatt.parse(str);
  310. // 年份大于9999年 则视为非法;
  311. if (tempDate.getYear() > 8099) {
  312. convertSuccess = false;
  313. }
  314. } catch (Exception e2) {
  315. convertSuccess = false;
  316. }
  317. }
  318. return convertSuccess;
  319. }
  320. /**
  321. * 根据当前时间获取文件夹
  322. * @return String
  323. */
  324. public static String getCurrentDateFolder() {
  325. Calendar now = Calendar.getInstance();
  326. int year = now.get(Calendar.YEAR);
  327. int month = now.get(Calendar.MONTH) + 1;
  328. int day = now.get(Calendar.DAY_OF_MONTH);
  329. return year + File.separator + month + File.separator + day + File.separator;
  330. }
  331. /**
  332. * 对比时间(精确到天)
  333. * @param date1
  334. * @param date2
  335. */
  336. public static boolean compareDateTimeSpecial(String date1, String date2, String order) {
  337. Date d1 = parseDateOnly(date1);
  338. Date d2 = parseDateOnly(date2);
  339. if (d1.equals(d2)) {
  340. return false;
  341. } else if (d1.before(d2)) {
  342. return true;
  343. } else {
  344. return false;
  345. }
  346. }
  347. /**
  348. * 获取两个日期之间相差多少天
  349. * @param date1
  350. * @param date2
  351. * @return
  352. */
  353. public static int getDayDiff(String date1,String date2)
  354. {
  355. DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
  356. Date star = parseDateOnly(date1);
  357. Date endDay=parseDateOnly(date2);
  358. Date nextDay=star;
  359. int i=0;
  360. while(nextDay.before(endDay)){//当明天不在结束时间之前是终止循环
  361. Calendar cld = Calendar.getInstance();
  362. cld.setTime(star);
  363. cld.add(Calendar.DATE, 1);
  364. star = cld.getTime();
  365. //获得下一天日期字符串
  366. nextDay = star;
  367. i++;
  368. }
  369. return i;
  370. }
  371. }