时间处理相关工具类(个人记录)

it2026-08-15  8

package com.supermarket.goods.utils; import org.springframework.util.Assert; import java.sql.Timestamp; import java.text.ParseException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; import static java.time.ZoneId.systemDefault; import static java.util.Date.from; /** * 描述:Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间) * * 1970年1月1日00:00:00这一刻之前或者是之后经历的毫秒数。 */ public class DateUtil { /** * 默认日期格式yyyy-MM-dd */ public static final String DEFAULT_YEAR_PATTERN = "yyyy"; public static final String DEFAULT_YEAR_MONTH_PATTERN = "yyyy-MM"; public static final String DEFAULT_DATE_SHORT_PATTERN = "yyyy-MM-dd"; public static final String DEFAULT_DATE_LONG_PATTERN = "yyyy-MM-dd HH:mm:ss"; public static final String DEFAULT_DATE_WEEK_PATTERN = "yyyy-MM-dd EE"; public static final String DEFAULT_DATE_PATTERN = "yyyyMMddHHmmssSSS"; public static final String DEFAULT_DATE_SHORT_M_PATTERN = "yyyyMMdd"; public static final String DEFAULT_DATE_LONG_M_PATTERN = "yyyyMMddHHmmss"; private static DateTimeFormatter yearTimeFormatter = DateTimeFormatter.ofPattern(DEFAULT_YEAR_PATTERN); private static DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(DEFAULT_YEAR_MONTH_PATTERN); private static DateTimeFormatter shortTimeFormatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_SHORT_PATTERN); private static DateTimeFormatter longTimeFormatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_LONG_PATTERN); private static final String[] MONTH = {"一月", "二月", "三月", "四月", "五月", "六月","七月", "八月", "九月", "十月", "十一月", "十二月"}; /** * 1秒 */ public static final long MILLIS_PER_SECOND = 1000; /** * 1分钟 */ public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND; /** * 1小时 */ public static final long MILLIS_PER_HOUR = 60 * MILLIS_PER_MINUTE; /** * 1天 */ public static final long MILLIS_PER_DAY = 24 * MILLIS_PER_HOUR; /** * 1个月(30天) */ public static final long MILLIS_PER_30DAY = 30 * MILLIS_PER_DAY; /** * 1个月(30天) */ public static final long MILLIS_PER_31DAY = 31 * MILLIS_PER_DAY; /** * 在组装时间时不改变的部分采用此值 */ public static final int TIME_NO_CHANGE = -1; /** * 表示时间为0 */ public static final int TIME_IS_ZERO = 0; /** * 获取某天的开始日期 * * @param offset 0今天,1明天,-1昨天,依次类推 * @return */ public static LocalDateTime dayStart(int offset) { return LocalDate.now().plusDays(offset).atStartOfDay(); } /** * 获取某天的开始日期 毫秒 * * @param offset 0今天,1明天,-1昨天,依次类推 * @return */ public static long dayStartMill(int offset) { return dayStart(offset).toInstant(ZoneOffset.of("+8")).toEpochMilli(); } /** * 获取某天的结束日期 * * @param offset 0今天,1明天,-1昨天,依次类推 * @return */ public static LocalDateTime dayEnd(int offset) { return LocalDateTime.of(dayStart(offset).toLocalDate(), LocalTime.MAX); } /** * 获取某天的结束日期 毫秒 * * @param offset 0今天,1明天,-1昨天,依次类推 * @return */ public static long dayEndMill(int offset) { return dayEnd(offset).toInstant(ZoneOffset.of("+8")).toEpochMilli(); } /** * 将毫秒转化为 yyyy-MM-dd HH:mm:ss * * @param time * @return */ public static String getFormatDate(long time) { return longTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault())); } /** * 将毫秒转化为 yyyy-MM-dd HH:mm:ss * * @param time * @return */ public static String getFormatDateYMD(long time) { return shortTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault())); } /** * 将毫秒转化为 yyyy * * @param time * @return */ public static String getFormatDateYear(long time) { return yearTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault())); } /** * 获得当前年份 * * @return 当前年份 */ public static int getCurrentYear() { Calendar cal = Calendar.getInstance(); return cal.get(Calendar.YEAR); } /** * 获得某个时间的年份 * * @param date 某个时间 * @return 某个时间的年份 */ public static int getSomeYear(Date date) { Calendar cal = dateToCalendar(date); return cal.get(Calendar.YEAR); } /** * 获得当前月份 * * @return 当前月份 */ public static int getCurrentMonth() { Calendar cal = Calendar.getInstance(); return cal.get(Calendar.MONTH) + 1; } /** * 获得某个时间的月份 * * @param date 某个时间 * @return 某个时间的月份 */ public static int getSomeMonth(Date date) { Calendar cal = dateToCalendar(date); return cal.get(Calendar.MONTH) + 1; } /** * 获得当前DAY OF MONTH * * @return 当前DAY OF MONTH */ public static int getCurrentDay() { Calendar cal = Calendar.getInstance(); return cal.get(Calendar.DAY_OF_MONTH); } /** * 获得某个时间的DAY OF MONTH * * @param date 某个时间 * @return 某个时间的DAY OF MONTH */ public static int getSomeDay(Date date) { Calendar cal = dateToCalendar(date); return cal.get(Calendar.DAY_OF_MONTH); } /** * 获得当前小时 * * @return 当前小时 */ public static int getCurrentHour() { Calendar cal = Calendar.getInstance(); return cal.get(Calendar.HOUR_OF_DAY); } /** * 获得某个时间的小时 * * @param date 某个时间 * @return 某个时间的小时 */ public static int getSomeHour(Date date) { Calendar cal = dateToCalendar(date); return cal.get(Calendar.HOUR_OF_DAY); } /** * 获得当前分钟 * * @return 当前分钟 */ public static int getCurrentMinute() { Calendar cal = Calendar.getInstance(); return cal.get(Calendar.MINUTE); } /** * 获得某个时间的分钟 * * @param date 某个时间 * @return 某个时间的分钟 */ public static int getSomeMinute(Date date) { Calendar cal = dateToCalendar(date); return cal.get(Calendar.MINUTE); } /** * 获得当前秒 * * @return 当前秒 */ public static int getCurrentSecond() { Calendar cal = Calendar.getInstance(); return cal.get(Calendar.SECOND); } /** * 获得某个时间的秒数 * * @param date 某个时间 * @return 某个时间的秒数 */ public static int getSomeSecond(Date date) { Calendar cal = dateToCalendar(date); return cal.get(Calendar.SECOND); } /** * 获得当前毫秒 * * @return 当前毫秒 */ public static int getCurrentMillisecond() { Calendar cal = Calendar.getInstance(); return cal.get(Calendar.MILLISECOND); } /** * 获得某个时间的毫秒 * * @param date 某个时间 * @return 某个时间的毫秒 */ public static int getSomeMillisecond(Date date) { Calendar cal = dateToCalendar(date); return cal.get(Calendar.MILLISECOND); } /** * 获得当前的日期 * * @return 返回当前的日期 */ public static Date getCurrentDate() { Calendar cal = Calendar.getInstance(); return cal.getTime(); } /** * 获得昨天日期 * * @return 返回昨天日期 */ public static Date getYestodayDate() { return new Date(System.currentTimeMillis() - MILLIS_PER_DAY); } /** * 获得昨天日期 * * @param date * @return 返回昨天日期 */ public static Date getYestodayDate(Date date) { return new Date(date.getTime() - MILLIS_PER_DAY); } /** * 获得30天前的日期时间戳 * * @param date * @return */ public static long get30DaysDate(long date) { return date - MILLIS_PER_30DAY; } /** * 获得明天日期 * * @return 返回明天日期 */ public static Date getTomorrowDate() { return new Date(System.currentTimeMillis() + MILLIS_PER_DAY); } /** * 获得指定日期的明天的日期 * * @param date * @return 返回明天日期 */ public static Date getTomorrowDate(Date date) { return new Date(date.getTime() + MILLIS_PER_DAY); } /** * 获得当前的日期(yyyy-MM-dd) * * @return 返回当前的日期 */ public static String getCurrentDateAccurateToDay() { return getCurrentDate(DEFAULT_DATE_PATTERN); } /** * 获得当前的日期(yyyy-MM-dd EE) 2020-10-22 星期四 * * @return 返回当前的日期 */ public static String getCurrentDateAccurateToWeek() { return getCurrentDate(DEFAULT_DATE_WEEK_PATTERN); } public static void main(String[] args) { String currentDateAccurateToWeek = getCurrentDateAccurateToWeek(); System.out.println(currentDateAccurateToWeek); } /** * 获得当前的时间(yyyy-MM-dd hh:mm:ss) * * @return 返回当前时间 */ public static String getCurrentDateAccurateToSecond() { return getCurrentDate(DEFAULT_DATE_LONG_PATTERN); } /** * 获得当前的时间(yyyyMMddHHmmssSSS) * * @return 返回当前时间 */ public static String formatDateAccurateToMillisecond(Date d) { return dateToString(d, "yyyyMMddHHmmssSSS"); } /** * 获得当前的时间(yyyyMMddHHmmssSSS) * * @return 返回当前时间 */ public static String getCurrentDateAccurateToMillisecond() { return getCurrentDate("yyyy-MM-dd HH:mm:ss,SSS"); } /** * 获得明天日期(yyyy-MM-dd) * * @return 返回明天日期 */ public static String getTomorrowStringDate() { return getTomorrowDate(DEFAULT_DATE_PATTERN); } /** * 获得昨天日期(yyyy-MM-dd) * * @return 返回昨天日期 */ public static String getYestodayStringDate() { return getYestodayDate(DEFAULT_DATE_PATTERN); } /** * 按格式获得昨天日期 * 例如:getYestodayDate("yyyy-MM-dd"); * * @param pattern * @return 返回昨天日期 */ public static String getYestodayDate(String pattern) { Date yestodayDate = new Date(System.currentTimeMillis() - MILLIS_PER_DAY); return dateToString(yestodayDate, pattern); } /** * 按格式获得明天日期 * 例如,getTomorrowDate("yyyy-MM-dd"); * * @param pattern * @return 返回明天日期 */ public static String getTomorrowDate(String pattern) { Date tomorrowDate = new Date(System.currentTimeMillis() + MILLIS_PER_DAY); return dateToString(tomorrowDate, pattern); } /** * 返回指定格式的当天日期 * 例如:getCurrentDate("yyyy-MM-dd"); * * @param pattern 时间样式 * @return 返回指定格式的当天日期 */ public static String getCurrentDate(String pattern) { return dateToString(new Date(), pattern); } /** * 获得当天是周几 */ public static String getWeekDay() { String[] weekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); int w = cal.get(Calendar.DAY_OF_WEEK) - 1; if (w < 0) { w = 0; } return weekDays[w]; } /** * 转换日期格式 * * @param date * @param oldPattern * @param newPattern * @return 转换格式后的日期 */ public static String getDateByFormat(String date, String oldPattern, String newPattern) { Assert.notNull(date, "指定日期为null"); Date newDate = stringToDate(date, oldPattern); return dateToString(newDate, newPattern); } /** * Date转换为String * * @param date * @param pattern * @return 字符串格式日期 */ public static String dateToString(Date date, String pattern) { Assert.notNull(date, "指定日期为null"); SimpleDateFormat sdf = new SimpleDateFormat(pattern); return sdf.format(date); } /** * String转换为Date * <p> * 说明:SimpleDateFormat是DateFormat的子类。 * 在DateFormat中,也可以调用parse方法来解析日期型的数据,不过不推荐这样做。 * 建议还是采用SimpleDateFormat类中parse(Strng source, ParsePosition positon)来解析。 * 具体原因,因为DateFormat中的parse方法有bug且不支持定位解析。 * * @param date * @return 分析成功则返回分析得到的日期,失败则返回null */ public static Date stringToDate(String date, String pattern) { return stringToDate(date, pattern, Locale.CHINA); } /** * String转换为Date * * @param date * @param pattern * @param locale * @return 分析成功则返回分析得到的日期,失败则返回null */ public static Date stringToDate(String date, String pattern, Locale locale) { SimpleDateFormat formate = new SimpleDateFormat(pattern, locale); Date newDate = formate.parse(date, new ParsePosition(0)); Assert.notNull(newDate, "日期可能与所给格式不匹配"); return newDate; } /** * String转换为Calendar * * @param date * @param pattern * @return Calendar */ public static Calendar stringToCalendar(String date, String pattern) { Assert.notNull(date, "指定日期为null"); Date newDate = stringToDate(date, pattern); return dateToCalendar(newDate); } /** * Calendar转Date * * @param cal * @return Date */ public static Date calendarToDate(Calendar cal) { return cal.getTime(); } /** * Date转Calendar * * @param date * @return Calendar */ public static Calendar dateToCalendar(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal; } /** * java.util.Date转java.sql.Date * * @param date * @return java.sql.Date */ public static java.sql.Date utilDateToSqlDate(Date date) { return new java.sql.Date(date.getTime()); } /** * java.sql.Date转java.util.Date * * @param date * @return java.util.Date */ public static Date sqlDateToUtilDate(java.sql.Date date) { return new Date(date.getTime()); } //NOTE 获得特定的日期 /** * 获得某一日期的yyyy-MM-dd 00:00:00形式 * * @param date 日期 * @return Date */ public static Date getSomeDateAccurateToMinHour(Date date) { Map map = new HashMap(); map.put(new Integer(Calendar.HOUR_OF_DAY), new Integer(TIME_IS_ZERO)); map.put(new Integer(Calendar.MINUTE), new Integer(TIME_IS_ZERO)); map.put(new Integer(Calendar.SECOND), new Integer(TIME_IS_ZERO)); return getSomeDate(date, map); } /** * 获得某一日期的yyyy-MM-dd 23:59:59形式 * * @param date 日期 * @return Date */ public static Date getSomeDateAccurateToMaxHour(Date date) { Map map = new HashMap(); map.put(new Integer(Calendar.HOUR_OF_DAY), new Integer(23)); map.put(new Integer(Calendar.MINUTE), new Integer(59)); map.put(new Integer(Calendar.SECOND), new Integer(59)); return getSomeDate(date, map); } /** * 获得某一日期的yyyy-MM-01 00:00:00形式 * * @param date 日期 * @return Date */ public static Date getSomeDateAccurateToMinMonth(Date date) { Map map = new HashMap(); map.put(new Integer(Calendar.DAY_OF_MONTH), new Integer(1)); map.put(new Integer(Calendar.HOUR_OF_DAY), new Integer(TIME_IS_ZERO)); map.put(new Integer(Calendar.MINUTE), new Integer(TIME_IS_ZERO)); map.put(new Integer(Calendar.SECOND), new Integer(TIME_IS_ZERO)); return getSomeDate(date, map); } /** * 获得某一日期的yyyy-MM-dd(dd为此月最后一天) 23:59:59形式 * * @param date 日期 * @return Date */ public static Date getSomeDateAccurateToMaxMonth(Date date) { Map map = new HashMap(); map.put(new Integer(Calendar.DAY_OF_MONTH), new Integer(getDaysOfMonth(date))); map.put(new Integer(Calendar.HOUR_OF_DAY), new Integer(23)); map.put(new Integer(Calendar.MINUTE), new Integer(59)); map.put(new Integer(Calendar.SECOND), new Integer(59)); return getSomeDate(date, map); } /** * 根据日期组装新的日期 * * @param date * @param calendar * @return Date */ public static Date getSomeDate(Date date, Map calendar) { Calendar cal = dateToCalendar(date); Iterator it = calendar.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); Integer key = (Integer) entry.getKey(); Integer value = (Integer) entry.getValue(); if (key.intValue() == Calendar.MONTH) { cal.set(key.intValue(), value.intValue() - 1); } else { cal.set(key.intValue(), value.intValue()); } } return calendarToDate(cal); } /** * 计算某年第几天的日期 * * @param year 年份 * @param dayOfYear 一年中的第几天 * @return 某年第几天的日期 */ public static String getDateWithDayOfYear(int year, int dayOfYear) { SimpleDateFormat df = new SimpleDateFormat(DEFAULT_DATE_PATTERN); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.DAY_OF_YEAR, dayOfYear); return df.format(cal.getTime()); } /** * 获得当前星期中某一天的日期 * * @param dayOfWeek 当前星期中的某一天 * @return 当前星期中某一天的日期 */ public static String getDateWithDayOfCurrentWeek(int dayOfWeek) { checkWeek(dayOfWeek); SimpleDateFormat df = new SimpleDateFormat(DEFAULT_DATE_PATTERN); Calendar cal = Calendar.getInstance(); cal.set(Calendar.DAY_OF_WEEK, dayOfWeek); if (dayOfWeek == Calendar.SUNDAY) { cal.add(Calendar.DATE, 7); } return df.format(cal.getTime()); } //NOTE 时期计算 /** * 获得某个月的天数 * * @param date 日期 * @return 某个月的天数 */ public static int getDaysOfMonth(Date date) { Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(Calendar.YEAR, getSomeYear(date)); cal.set(Calendar.MONTH, getSomeMonth(date) - 1); return cal.getActualMaximum(Calendar.DAY_OF_MONTH); } /** * 返回某年的天数 * * @param year * @return 某年的天数 */ public static int getDaysOfYear(int year) { return isLeapYear(year) ? 366 : 365; } /** * 日期计算,当前日期加或减掉相应的小时数 * * @param date 日期 * @param hour 小时数 * @return 返回计算后的日期 */ public static Date calculateWithHour(Date date, int hour) { Calendar cal = dateToCalendar(date); cal.set(Calendar.HOUR_OF_DAY, hour); return cal.getTime(); } /** * 日期计算,当前日期加或减掉相应的天数 * * @param date 日期 * @param day 天数 * @return 返回计算后的日期 */ public static Date calculateWithDay(Date date, int day) { Calendar cal = dateToCalendar(date); cal.setTimeInMillis(cal.getTimeInMillis() + day * MILLIS_PER_DAY); return cal.getTime(); } /** * 日期计算,当前日期加或减掉相应的月 * * @param date 日期 * @param month 月份数 * @return 返回计算后的日期 */ public static Date calculateWithMonth(Date date, int month) { Calendar cal = dateToCalendar(date); cal.add(Calendar.MONTH, month); return cal.getTime(); } /** * 日期计算,当前日期加或减掉相应的年数 * * @param date 日期 * @param year 年数 * @return 返回计算后的日期 */ public static Date calculateWithYear(Date date, int year) { Calendar cal = dateToCalendar(date); cal.set(Calendar.YEAR, year); return cal.getTime(); } /** * 日期计算,当前日期加或减掉相应的小时数 * * @param date 日期 * @param hour 小时数 * @return 返回计算后的日期 */ public static String calculateWithHour(String date, int hour) { Date temp = calculateWithHour(stringToDate(date, DEFAULT_DATE_PATTERN), hour); return dateToString(temp, DEFAULT_DATE_PATTERN); } /** * 日期计算,当前日期加或减掉相应的天数 * * @param date 日期 * @param day 天数 * @return 返回计算后的日期 */ public static String calculateWithDay(String date, int day) { Date temp = calculateWithDay(stringToDate(date, DEFAULT_DATE_PATTERN), day); return dateToString(temp, DEFAULT_DATE_PATTERN); } /** * 日期计算,当前日期加或减掉相应的月数 * * @param date 日期 * @param month 月数 * @return 返回计算后的日期 */ public static String calculateWithMonth(String date, int month) { Date temp = calculateWithMonth(stringToDate(date, DEFAULT_DATE_PATTERN), month); return dateToString(temp, DEFAULT_DATE_PATTERN); } /** * 日期计算,当前日期加或减掉相应的年数 * * @param date 日期 * @param year 年数 * @return 返回计算后的日期 */ public static String calculateWithYear(String date, int year) { Date temp = calculateWithYear(stringToDate(date, DEFAULT_DATE_PATTERN), year); return dateToString(temp, DEFAULT_DATE_PATTERN); } /** * 计算两天之间的天数,日期格式为yyyy-MM-dd * @param date1 The first date. * @param date2 The second date. * @return The number of days between the two dates. Zero is */ public static int getBetweenDays(Date date1, Date date2) { Calendar d1 = dateToCalendar(date1); Calendar d2 = dateToCalendar(date2); if (d1.after(d2)) { Calendar swap = d1; d1 = d2; d2 = swap; } int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR); int y2 = d2.get(Calendar.YEAR); if (d1.get(Calendar.YEAR) != y2) { d1 = (Calendar) d1.clone(); do { days += d1.getActualMaximum(Calendar.DAY_OF_YEAR); d1.add(Calendar.YEAR, 1); } while (d1.get(Calendar.YEAR) != y2); } return days; } /** * 计算两天之间的天数,日期格式为yyyy-MM-dd * @param date1 * @param date2 * @return */ public static int getBetweenDaysByNegative(Date date1, Date date2) { Calendar d1 = dateToCalendar(date1); Calendar d2 = dateToCalendar(date2); if (d1.after(d2)) { Calendar swap = d1; d1 = d2; d2 = swap; int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR); int y2 = d2.get(Calendar.YEAR); if (d1.get(Calendar.YEAR) != y2) { d1 = (Calendar) d1.clone(); do { days += d1.getActualMaximum(Calendar.DAY_OF_YEAR); d1.add(Calendar.YEAR, 1); } while (d1.get(Calendar.YEAR) != y2); } return -days; } else { int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR); int y2 = d2.get(Calendar.YEAR); if (d1.get(Calendar.YEAR) != y2) { d1 = (Calendar) d1.clone(); do { days += d1.getActualMaximum(Calendar.DAY_OF_YEAR); d1.add(Calendar.YEAR, 1); } while (d1.get(Calendar.YEAR) != y2); } return days; } } /** * 计算两个时间之间的分钟数,小时格式为 HH:mm * * @param date1 * @param date2 * @return 两时间分钟之差 */ public static int getBetweenMinute(Date date1, Date date2) { return (int) (getBetweenMillis(date1, date2) / MILLIS_PER_MINUTE); } /** * 计算两个时间之间的分钟数,小时格式为 HH:mm * * @param date1 * @param date2 * @return 两时间分钟之差 */ public static int getBetweenSecond(Date date1, Date date2) { return (int) (getBetweenMillis(date1, date2) / MILLIS_PER_SECOND); } /** * 计算两个小时之间的毫秒数 * * @param date1 * @param date2 * @return 两时间毫秒之差 */ public static long getBetweenMillis(Date date1, Date date2) { Calendar d1 = dateToCalendar(date1); Calendar d2 = dateToCalendar(date2); if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end Calendar swap = d1; d1 = d2; d2 = swap; } return d2.getTimeInMillis() - d1.getTimeInMillis(); } //NOTE 判断日期 /** * 判断是否为闰年 * * @param year * @return true是闰年,false不是闰年 */ public static boolean isLeapYear(int year) { boolean isLeapYear = false; int gregorianCutoverYear = 1582;//1582 年定的 Gregorian Calendar 才再增加百年不潤四百年潤的規則 if (year >= gregorianCutoverYear) { if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) { isLeapYear = true; } } else { if (year % 4 == 0) { isLeapYear = true; } } return isLeapYear; } /** * 检查年份是否合法 * * @param year 年份 */ public static void checkYear(int year) { Assert.isTrue((year > 10000 || year < 1000), "您输入的年份越界,必须在1000~9999之间"); } /** * 检测月份是否合法 * * @param month 月份 */ public static void checkMonth(int month) { Assert.isTrue((month < 1 || month > 12), "您输入的月份不合法,必须在1~12之间"); } /** * 检测星期是否合法 * * @param week 月份 */ public static void checkWeek(int week) { Assert.isTrue((week < 1 || week > 7), "您输入的星期不合法,必须在1~7之间"); } /** * 检查日子是否合法 * * @param date 日期 */ public static void checkDayOfMonth(Date date) { int day = getSomeDay(date); Assert.isTrue((day < 1), "您输入的日期不合法,日必须大于零"); Assert.isTrue((day > getDaysOfMonth(date)), "您输入的日期不合法,日必须小于当月最大天数"); } /** * 检查日子是否合法 * * @param year 日期 * @param dayOfYear 一年中的第几天 */ public static void checkDayOfYear(int year, int dayOfYear) { Assert.isTrue((dayOfYear < 1), "您输入的日期不合法,日必须大于零"); Assert.isTrue((dayOfYear > getDaysOfYear(year)), "您输入的日期不合法,日必须小于当年最大天数"); } /** * 比较时间的新旧 * * @param oldDate 旧时间 * @param newDate 新时间 * @param pattern 时间样式 * @return true 如果newDate比oldDate新 */ public static boolean compareBothDate(String oldDate, String newDate, String pattern) { Calendar c1 = stringToCalendar(oldDate, pattern); Calendar c2 = stringToCalendar(newDate, pattern); return (c2.getTimeInMillis() - c1.getTimeInMillis()) >= 0; } /** * 比较两个日期是否相同 * * @param oldDate * @param newDate * @param pattern * @return */ public static boolean compareSameDate(String oldDate, String newDate, String pattern) { Calendar c1 = stringToCalendar(oldDate, pattern); Calendar c2 = stringToCalendar(newDate, pattern); return (c2.getTimeInMillis() - c1.getTimeInMillis()) == 0; } /** * 获得当前时间是一周的第几天 * * @return 周一到周日分别是 1-7 */ public static int getDayOfweek() { int week = 0; Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); week = calendar.get(Calendar.DAY_OF_WEEK); week = week - 1; if (week == 0) { week = 7; } return week; } /** * 获得当前的时间(yyyyMMdd) * * @return 返回当前时间 */ public static String getLittleDate() { return getCurrentDate(DEFAULT_DATE_SHORT_M_PATTERN); } /** * 获得当前的时间(yyyyMMddHHmmss) * * @return 返回当前时间 */ public static String getToSecond() { return getCurrentDate(DEFAULT_DATE_LONG_M_PATTERN); } /** * 根据毫秒数换算成天、时、分、秒 * * @param mss 毫秒 * @param model 格式 1:x天x小时 0:x-x:x:x * @return 时间 */ public static String getDay(Long mss, int model) { String day = String.valueOf(mss / (1000 * 60 * 60 * 24)); String hour = String.valueOf((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); String minutes = String.valueOf((mss % (1000 * 60 * 60)) / (1000 * 60)); String seconds = String.valueOf((mss % (1000 * 60)) / 1000); if (model == 1) { return day + "天 " + hour + "小时"; } else { return day + " " + hour + ":" + minutes + ":" + seconds; } } public static String formatDate10(Date newDate) { SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_SHORT_PATTERN); String date = dateFormat.format(newDate); return date; } /** * @param pattern * @param days * @return */ public static String getBeforeDays(String pattern, Integer days) { SimpleDateFormat sdf = new SimpleDateFormat(pattern); Calendar cal = dateToCalendar(new Date()); cal.add(Calendar.DATE, days); return sdf.format(cal.getTime()); } /** * 将毫秒值转换为时分秒(HH时mm分ss秒) * * @param mtime * @return 1. 30秒 * 2. 2分40秒 * 3. 4小时50分5秒 */ public static String Millis2HMSTime(long mtime) { long lTime = mtime / 1000; int time = Integer.parseInt(lTime + ""); String timeStr = null; int hour = 0; int minute = 0; int second = 0; if (time <= 0) return "0分0秒"; else { minute = time / 60; if (minute < 60) { second = time % 60; if (minute == 0) { timeStr = unitFormat(second) + "秒"; } else { timeStr = minute + "分" + unitFormat(second) + "秒"; } } else { hour = minute / 60; if (hour > 99999) { return "99999时59分59秒"; } minute = minute % 60; second = time - hour * 3600 - minute * 60; timeStr = hour + "时" + unitFormat(minute) + "分" + unitFormat(second) + "秒"; } } return timeStr; } /** * 将毫秒值转换为时分秒(D天HH小时mm分钟) * 将 毫秒转化 天 小时 分钟 * * @param ms 毫秒数 */ public static String Millis2DHMTime(Long ms) { Integer ss = 1000; Integer mi = ss * 60; Integer hh = mi * 60; Integer dd = hh * 24; Long day = ms / dd; Long hour = (ms - day * dd) / hh; Long minute = (ms - day * dd - hour * hh) / mi; // Long second = (ms - day * dd - hour * hh - minute * mi) / ss; StringBuilder sb = new StringBuilder(); if (day > 0) { sb.append(day + "天"); } if (hour > 0) { sb.append(hour + "小时"); } if (minute > 0) { sb.append(minute + "分钟"); } /* if(second > 0) { sb.append(second+"秒"); } */ return sb.toString(); } /** * 将秒值转换为时分秒(D天HH小时mm分钟) * 将 毫秒转化 天 小时 分钟 * * @param s 秒数 */ public static String secondMillis2DHMTime(Long s) { Integer ss = 1; Integer mi = ss * 60; Integer hh = mi * 60; Integer dd = hh * 24; Long day = s / dd; Long hour = (s - day * dd) / hh; Long minute = (s - day * dd - hour * hh) / mi; StringBuilder sb = new StringBuilder(); if (day > 0) { sb.append(day + "天"); } if (hour > 0) { sb.append(hour + "小时"); } if (minute > 0) { sb.append(minute + "分钟"); } /* if(second > 0) { sb.append(second+"秒"); } */ return sb.toString(); } private static String unitFormat(int i) { String retStr = null; if (i >= 0 && i < 10) { retStr = "0" + Integer.toString(i); } else { retStr = "" + i; } return retStr; } public static Date getNow() { return from(LocalDateTime.now().atZone(systemDefault()).toInstant()); } /** * 日期加上天数后的日期 * * @param * @param count * @return * @throws ParseException */ public static Date getEndTime(Date date, int count) { Calendar ca = Calendar.getInstance(); ca.setTime(date); ca.add(Calendar.DATE, count);// count为增加的天数,可以改变的 Date currdate = ca.getTime(); return currdate; } /** * 获取一个较早的时间 * * @return */ public static Date getDate(String dateTime) { SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DEFAULT_DATE_LONG_PATTERN); try { return dateTimeFormat.parse(dateTime); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 获取间隔天数 * * @param startTime * @param endTime * @return */ public static int getIntervalDay(Date startTime, Date endTime) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(startTime); Calendar cal2 = Calendar.getInstance(); cal2.setTime(endTime); int day1 = cal1.get(Calendar.DAY_OF_YEAR); int day2 = cal2.get(Calendar.DAY_OF_YEAR); int year1 = cal1.get(Calendar.YEAR); int year2 = cal2.get(Calendar.YEAR); if (year1 != year2) //不同年 { int timeDistance = 0; for (int i = year1; i < year2; i++) { if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) //闰年 { timeDistance += 366; } else //不是闰年 { timeDistance += 365; } } return timeDistance + (day2 - day1); } else { //同一年 return day2 - day1; } } /** * 格式日期yyyy-MM-dd HH:mm:ss * * @return */ public static String formatDateTime(Date date) { if (date == null) { return ""; } Calendar tempDate = Calendar.getInstance(); tempDate.setTime(date); SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DEFAULT_DATE_LONG_PATTERN); return dateTimeFormat.format(tempDate.getTime()); } /** * 获取00:00:00 * * @param date * @return */ public static Date getDayStart(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } /** * 获取23:59:59 * * @param date * @return */ public static Date getDayEnd(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); c.set(Calendar.MILLISECOND, 999); return c.getTime(); } /** * String转timestamp * * @param time * @return */ public static Timestamp formatTimestamp(String time) { Timestamp ts = Timestamp.valueOf(time); return ts; } /** * long转date * * @param dateLong * @return */ public static Date longToDate(long dateLong) { Date date = new Date(dateLong); return date; } public static Date localTimeToDate(LocalDateTime localDateTime) { ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); Date date = Date.from(instant); return date; } /** * 获取对应时间的月份开始时间 * * @param d 对应日期 * @return */ public static Date getStartDateOfMonth(Date d) { Calendar c = Calendar.getInstance(); c.setTime(d); c.add(Calendar.MONTH, 0); //设置为1号,当前日期既为本月第一天 c.set(Calendar.DAY_OF_MONTH, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } /** * 将一个LocalDataTime格式化成年月格式 * * @param localDate 时间 java8 * @return 格式化后的年月String */ public static String getYearMonthFromLocalDataTime(LocalDate localDate) { return timeFormatter.format(localDate); } /** * 获取当前月份的1号日期 * * @param localDate * @return */ public static LocalDate getFirstDayOfMonth(LocalDate localDate) { int year = localDate.getYear(); Month month = localDate.getMonth(); return LocalDate.of(year, month, 1); } /** * 获取两个日期之间的年月set * * @param start 开始时间 * @param end 结束时间 * @param set 存放数据集合 */ private static void getSubYearMonth(LocalDate start, LocalDate end, Set<String> set) { start = getFirstDayOfMonth(start); end = getFirstDayOfMonth(end); for (LocalDate i = start; i.isBefore(end) || i.equals(end); i = i.plusMonths(1L)) { set.add(getYearMonthFromLocalDataTime(i)); } } /** * 获取某年的开始时间 * * @param offset 0今年,1明年,-1去年,依次类推 * @return */ public static String yearStart(int offset) { LocalDate localDate = LocalDate.now() .plusYears(offset).with(TemporalAdjusters.firstDayOfYear()); ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zonedDate = localDate.atStartOfDay(zoneId); Date date = Date.from(zonedDate.toInstant()); return dateToString(date, DEFAULT_DATE_LONG_PATTERN); } /** * 获取某年的开始时间 * * @param offset 0今年,1明年,-1去年,依次类推 * @return */ public static Date yearStartDate(int offset) { LocalDate localDate = LocalDate.now() .plusYears(offset).with(TemporalAdjusters.firstDayOfYear()); ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zonedDate = localDate.atStartOfDay(zoneId); return Date.from(zonedDate.toInstant()); } /** * 获取类似格式 * [2020-01, 2020-02, 2020-03, 2020-04, 2020-05, 2020-06, 2020-07] */ public static Set<String> getSubYearMonth() { Set<String> set = new LinkedHashSet<>(); LocalDate yearStart = LocalDate.now() .with(TemporalAdjusters.firstDayOfYear()); getSubYearMonth(yearStart, LocalDate.now(), set); return set; } /** * 获取今年的月份 * [一月, 二月, 三月, 四月, 五月, 六月, 七月] */ public static Set<String> getSubMonth() { LocalDateTime start = LocalDateTime.now() .with(TemporalAdjusters.firstDayOfYear()); Set<String> set = new LinkedHashSet<>(); int startMonthValue = start.getMonthValue(); int endMonthValue = LocalDateTime.now().getMonthValue(); for (int i = startMonthValue; i <= endMonthValue; i++) { set.add(MONTH[i - 1]); } return set; } /** * long转换 LocalDate * @param timestamp * @return */ public static LocalDate long2LocalDate(Long timestamp) { return LocalDateTime .ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()) .toLocalDate(); } }
最新回复(0)