JAVA 日期工具类(全面,代码可以直接使用)

这是一个比较全面的时间工具类,可供参考!

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.ImmutableMap;
import com.springboot.cloud.msp.common.core.model.DateStyle;
import com.springboot.cloud.msp.common.core.util.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;

/**
 * 日期工具类
 *
 * @author [chen.hao78]
 * @version [1.0, 2022/10/27]
 */
@Slf4j
public class DateUtil {
    /**
     * 判断指定日期属于本年的第几周
     *
     * @throws [异常类型] [异常说明]
     * @param: date
     * @return: int
     */
    public static String weekOfYear(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.SUNDAY);
        calendar.setTime(date);
        int i = calendar.get(Calendar.WEEK_OF_YEAR);
        DecimalFormat df = new DecimalFormat("00");
        String str = df.format(i);
        return str;
    }

    /**
     * 〈返回指定日期所处周的起始日(周日为起始日)〉
     * @param: date
     * @return: java.util.Date
     * @throws [异常类型] [异常说明]
     */
    public static Date beginOfWeek(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        Calendar calendar1 = cn.hutool.core.date.DateUtil.beginOfWeek(calendar, false);
        String format = cn.hutool.core.date.DateUtil.format(calendar1.getTime(), "yyyy-MM-dd");
        DateTime dateTime = cn.hutool.core.date.DateUtil.parseDate(format);
        return dateTime;
    }

    /**
     * 〈指定日期对应当周最后一天日期〉
     * @param: date
     * @param: isSundayAsLastDay
     * @return: java.util.Date
     * @throws [异常类型] [异常说明]
     */
    public static Date endOfWeek(Date date, boolean isSundayAsLastDay){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        Calendar calendar1 = cn.hutool.core.date.DateUtil.endOfWeek(calendar, isSundayAsLastDay);
        return calendar1.getTime();
    }

    /**
     * 〈获取指定周数之内的日期范围〉
     * @param: weeks
     * @return: java.util.Map<java.lang.String,java.lang.String>
     * @throws [异常类型] [异常说明]
     */
    public static Map<String, String> getTimeRegionForWeek(Integer weeks) {
        Date date = new Date();
        // 当前周
        String minWeek = DateUtil.weekOfYear(date);
        // 当前年份
        int minYear = cn.hutool.core.date.DateUtil.year(date);
        // 当前年周
        String minYearWeek = minYear + minWeek;
        log.debug("minYearWeek==" + minYearWeek);
        // 本周最后一天(周六)偏移weeks周的日期
        DateTime maxWeekDate = cn.hutool.core.date.DateUtil.offsetWeek(DateUtil.endOfWeek(date, false), weeks);
        String maxWeek = DateUtil.weekOfYear(maxWeekDate);
        int maxYear = cn.hutool.core.date.DateUtil.year(maxWeekDate);
        String maxYearWeek = maxYear + maxWeek;
        log.debug("maxYearWeek==" + maxYearWeek);
        // 当前日期
        String minDay = cn.hutool.core.date.DateUtil.today();
        log.debug("minDay===" + minDay);
        // 当前日期加上生产周数后的那一周的最后一天日期
        Calendar maxWeekDateCal = cn.hutool.core.date.DateUtil.calendar(maxWeekDate);
        Date time = cn.hutool.core.date.DateUtil.endOfWeek(maxWeekDateCal, false).getTime();
        String maxDay = cn.hutool.core.date.DateUtil.format(time, "yyyy-MM-dd");
        log.debug("maxDay=" + maxDay);
        return ImmutableMap.of("minYearWeek", minYearWeek, "maxYearWeek", maxYearWeek, "minDay", minDay, "maxDay", maxDay);
    }

    public static int compare(Date date1, Date date2){
        String date1Str = cn.hutool.core.date.DateUtil.format(date1, DatePattern.PURE_DATE_PATTERN);
        String date2Str = cn.hutool.core.date.DateUtil.format(date2, DatePattern.PURE_DATE_PATTERN);
        Date newDate1 = DateUtil.parse(date1Str, DatePattern.PURE_DATE_PATTERN);
        Date newDate2 = DateUtil.parse(date2Str, DatePattern.PURE_DATE_PATTERN);
        return cn.hutool.core.date.DateUtil.compare(newDate1, newDate2);
    }

    public static Boolean isHistory(String dateStr) {
        Date date = DateUtil.parse(dateStr, DatePattern.PURE_DATE_PATTERN);
        Date today = new Date();
        return compare(date, today) < 0;
    }

    /**
     * 日期格式
     */
    public static final String YYYY_MM_DD = "yyyy-MM-dd";

    /**
     * 日期格式
     */
    public static final String YYYYMMDD = "yyyyMMdd";

    /**
     * 日期格式
     */
    public static final String YYYY_MM_DD_HH_MM_SS = YYYY_MM_DD + " HH:mm:ss";

    /**
     * 获取SimpleDateFormat
     *
     * @param parttern 日期格式
     * @return SimpleDateFormat对象
     * @throws RuntimeException 异常:非法日期格式
     */
    public static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException {
        return new SimpleDateFormat(parttern);
    }


    /**
     * 获取日期中的某数值。如获取月份
     *
     * @param date     日期
     * @param dateType 日期格式
     * @return 数值
     */
    public static int getInteger(Date date, int dateType) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(dateType);
    }

    /**
     * 增加日期中某类型的某数值。如增加日期
     *
     * @param date     日期字符串
     * @param dateType 类型
     * @param amount   数值
     * @return 计算后日期字符串
     */
    public static String addInteger(String date, int dateType, int amount) {
        String dateString = null;
        DateStyle dateStyle = getDateStyle(date);
        if (dateStyle != null) {
            Date myDate = stringToDate(date, dateStyle);
            myDate = addInteger(myDate, dateType, amount);
            dateString = dateToString(myDate, dateStyle);
        }
        return dateString;
    }

    /**
     * 增加日期中某类型的某数值。如增加日期
     *
     * @param date     日期
     * @param dateType 类型
     * @param amount   数值
     * @return 计算后日期
     */
    public static Date addInteger(Date date, int dateType, int amount) {
        Date myDate = null;
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(dateType, amount);
            myDate = calendar.getTime();
        }
        return myDate;
    }

    /**
     * 获取精确的日期
     *
     * @param timestamps 时间long集合
     * @return 日期
     */
    public static Date getAccurateDate(List<Long> timestamps) {
        Date date = null;
        long timestamp = 0;
        Map<Long, long[]> map = new HashMap<Long, long[]>(512);
        List<Long> absoluteValues = new ArrayList<Long>();

        if (timestamps != null && timestamps.size() > 0) {
            if (timestamps.size() > 1) {
                for (int i = 0; i < timestamps.size(); i++) {
                    for (int j = i + 1; j < timestamps.size(); j++) {
                        long absoluteValue = Math.abs(timestamps.get(i) - timestamps.get(j));
                        absoluteValues.add(absoluteValue);
                        long[] timestampTmp = {timestamps.get(i), timestamps.get(j)};
                        map.put(absoluteValue, timestampTmp);
                    }
                }

                long minAbsoluteValue = -1;
                if (!absoluteValues.isEmpty()) {
                    minAbsoluteValue = absoluteValues.get(0);
                }
                for (int i = 0; i < absoluteValues.size(); i++) {
                    for (int j = i + 1; j < absoluteValues.size(); j++) {
                        if (absoluteValues.get(i) > absoluteValues.get(j)) {
                            minAbsoluteValue = absoluteValues.get(j);
                        } else {
                            minAbsoluteValue = absoluteValues.get(i);
                        }
                    }
                }

                if (minAbsoluteValue != -1) {
                    long[] timestampsLastTmp = map.get(minAbsoluteValue);
                    if (absoluteValues.size() > 1) {
                        timestamp = Math.max(timestampsLastTmp[0], timestampsLastTmp[1]);
                    } else if (absoluteValues.size() == 1) {
                        long dateOne = timestampsLastTmp[0];
                        long dateTwo = timestampsLastTmp[1];
                        long max = 100000000000L;
                        if ((Math.abs(dateOne - dateTwo)) < max) {
                            timestamp = Math.max(timestampsLastTmp[0], timestampsLastTmp[1]);
                        } else {
                            long now = System.currentTimeMillis();
                            if (Math.abs(dateOne - now) <= Math.abs(dateTwo - now)) {
                                timestamp = dateOne;
                            } else {
                                timestamp = dateTwo;
                            }
                        }
                    }
                }
            } else {
                timestamp = timestamps.get(0);
            }
        }

        if (timestamp != 0) {
            date = new Date(timestamp);
        }
        return date;
    }

    /**
     * 判断字符串是否为日期字符串
     *
     * @param date 日期字符串
     * @return true or false
     */
    public static boolean isDate(String date) {
        boolean isDate = false;
        if (date != null) {
            if (stringToDate(date) != null) {
                isDate = true;
            }
        }
        return isDate;
    }

    /**
     * 获取日期字符串的日期风格。失敗返回null。
     *
     * @param date 日期字符串
     * @return 日期风格
     */
    public static DateStyle getDateStyle(String date) {
        DateStyle dateStyle = null;
        Map<Long, DateStyle> map = new HashMap<Long, DateStyle>(512);
        List<Long> timestamps = new ArrayList<Long>();
        for (DateStyle style : DateStyle.values()) {
            Date dateTmp = stringToDate(date, style.getValue());
            if (dateTmp != null) {
                timestamps.add(dateTmp.getTime());
                map.put(dateTmp.getTime(), style);
            }
        }
        dateStyle = map.get(getAccurateDate(timestamps).getTime());
        return dateStyle;
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     *
     * @param date 日期字符串
     * @return 日期
     */
    public static Date stringToDate(String date) {
        DateStyle dateStyle = null;
        return stringToDate(date, dateStyle);
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     *
     * @param date     日期字符串
     * @param parttern 日期格式
     * @return 日期
     */
    public static Date stringToDate(String date, String parttern) {
        Date myDate = null;
        if (date != null) {
            try {
                myDate = getDateFormat(parttern).parse(date);
            } catch (Exception e) {
            }
        }
        return myDate;
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     *
     * @param date      日期字符串
     * @param dateStyle 日期风格
     * @return 日期
     */
    public static Date stringToDate(String date, DateStyle dateStyle) {
        Date myDate = null;
        if (dateStyle == null) {
            List<Long> timestamps = new ArrayList<Long>();
            for (DateStyle style : DateStyle.values()) {
                Date dateTmp = stringToDate(date, style.getValue());
                if (dateTmp != null) {
                    timestamps.add(dateTmp.getTime());
                }
            }
            myDate = getAccurateDate(timestamps);
        } else {
            myDate = stringToDate(date, dateStyle.getValue());
        }
        return myDate;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     *
     * @param date     日期
     * @param parttern 日期格式
     * @return 日期字符串
     */
    public static String dateToString(Date date, String parttern) {
        String dateString = null;
        if (date != null) {
            try {
                dateString = getDateFormat(parttern).format(date);
            } catch (Exception e) {
            }
        }
        return dateString;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     *
     * @param date      日期
     * @param dateStyle 日期风格
     * @return 日期字符串
     */
    public static String dateToString(Date date, DateStyle dateStyle) {
        String dateString = null;
        if (dateStyle != null) {
            dateString = dateToString(date, dateStyle.getValue());
        }
        return dateString;
    }

    /**
     * 将日期字符串转化为另一日期字符串。失败返回null。
     *
     * @param date     旧日期字符串
     * @param parttern 新日期格式
     * @return 新日期字符串
     */
    public static String stringToString(String date, String parttern) {
        return stringToString(date, null, parttern);
    }

    /**
     * 将日期字符串转化为另一日期字符串。失败返回null。
     *
     * @param date      旧日期字符串
     * @param dateStyle 新日期风格
     * @return 新日期字符串
     */
    public static String stringToString(String date, DateStyle dateStyle) {
        return stringToString(date, null, dateStyle);
    }

    /**
     * 将日期字符串转化为另一日期字符串。失败返回null。
     *
     * @param date         旧日期字符串
     * @param olddParttern 旧日期格式
     * @param newParttern  新日期格式
     * @return 新日期字符串
     */
    public static String stringToString(String date, String olddParttern, String newParttern) {
        String dateString = null;
        if (olddParttern == null) {
            DateStyle style = getDateStyle(date);
            if (style != null) {
                Date myDate = stringToDate(date, style.getValue());
                dateString = dateToString(myDate, newParttern);
            }
        } else {
            Date myDate = stringToDate(date, olddParttern);
            dateString = dateToString(myDate, newParttern);
        }
        return dateString;
    }

    /**
     * 将日期字符串转化为另一日期字符串。失败返回null。
     *
     * @param date         旧日期字符串
     * @param olddDteStyle 旧日期风格
     * @param newDateStyle 新日期风格
     * @return 新日期字符串
     */
    public static String stringToString(String date, DateStyle olddDteStyle, DateStyle newDateStyle) {
        String dateString = null;
        if (olddDteStyle == null) {
            DateStyle style = getDateStyle(date);
            dateString = stringToString(date, style.getValue(), newDateStyle.getValue());
        } else {
            dateString = stringToString(date, olddDteStyle.getValue(), newDateStyle.getValue());
        }
        return dateString;
    }

    /**
     * 增加日期的年份。失败返回null。
     *
     * @param date       日期
     * @param yearAmount 增加数量。可为负数
     * @return 增加年份后的日期字符串
     */
    public static String addYear(String date, int yearAmount) {
        return addInteger(date, Calendar.YEAR, yearAmount);
    }

    /**
     * 增加日期的年份。失败返回null。
     *
     * @param date       日期
     * @param yearAmount 增加数量。可为负数
     * @return 增加年份后的日期
     */
    public static Date addYear(Date date, int yearAmount) {
        return addInteger(date, Calendar.YEAR, yearAmount);
    }

    /**
     * 增加日期的月份。失败返回null。
     *
     * @param date       日期
     * @param yearAmount 增加数量。可为负数
     * @return 增加月份后的日期字符串
     */
    public static String addMonth(String date, int yearAmount) {
        return addInteger(date, Calendar.MONTH, yearAmount);
    }

    /**
     * 增加日期的月份。失败返回null。
     *
     * @param date       日期
     * @param yearAmount 增加数量。可为负数
     * @return 增加月份后的日期
     */
    public static Date addMonth(Date date, int yearAmount) {
        return addInteger(date, Calendar.MONTH, yearAmount);
    }

    /**
     * 增加日期的天数。失败返回null。
     *
     * @param date      日期字符串
     * @param dayAmount 增加数量。可为负数
     * @return 增加天数后的日期字符串
     */
    public static String addDay(String date, int dayAmount) {
        return addInteger(date, Calendar.DATE, dayAmount);
    }

    /**
     * 增加日期的天数。失败返回null。
     *
     * @param date      日期
     * @param dayAmount 增加数量。可为负数
     * @return 增加天数后的日期
     */
    public static Date addDay(Date date, int dayAmount) {
        return addInteger(date, Calendar.DATE, dayAmount);
    }

    /**
     * 增加日期的小时。失败返回null。
     *
     * @param date 日期字符串 dayAmount 增加数量。可为负数
     * @return 增加小时后的日期字符串
     */
    public static String addHour(String date, int hourAmount) {
        return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);
    }

    /**
     * 增加日期的小时。失败返回null。
     *
     * @param date 日期 dayAmount 增加数量。可为负数
     * @return 增加小时后的日期
     */
    public static Date addHour(Date date, int hourAmount) {
        return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);
    }

    /**
     * 增加日期的分钟。失败返回null。
     *
     * @param date 日期字符串 dayAmount 增加数量。可为负数
     * @return 增加分钟后的日期字符串
     */
    public static String addMinute(String date, int hourAmount) {
        return addInteger(date, Calendar.MINUTE, hourAmount);
    }

    /**
     * 增加日期的分钟。失败返回null。
     *
     * @param date 日期 dayAmount 增加数量。可为负数
     * @return 增加分钟后的日期
     */
    public static Date addMinute(Date date, int hourAmount) {
        return addInteger(date, Calendar.MINUTE, hourAmount);
    }

    /**
     * 增加日期的秒钟。失败返回null。
     *
     * @param date 日期字符串 dayAmount 增加数量。可为负数
     * @return 增加秒钟后的日期字符串
     */
    public static String addSecond(String date, int hourAmount) {
        return addInteger(date, Calendar.SECOND, hourAmount);
    }

    /**
     * 增加日期的秒钟。失败返回null。
     *
     * @param date 日期 dayAmount 增加数量。可为负数
     * @return 增加秒钟后的日期
     */
    public static Date addSecond(Date date, int hourAmount) {
        return addInteger(date, Calendar.SECOND, hourAmount);
    }

    /**
     * 获取日期的年份。失败返回0。
     *
     * @param date 日期字符串
     * @return 年份
     */
    public static int getYear(String date) {
        return getYear(stringToDate(date));
    }

    /**
     * 获取日期的年份。失败返回0。
     *
     * @param date 日期
     * @return 年份
     */
    public static int getYear(Date date) {
        return getInteger(date, Calendar.YEAR);
    }

    /**
     * 获取日期的月份。失败返回0。
     *
     * @param date 日期字符串
     * @return 月份
     */
    public static int getMonth(String date) {
        return getMonth(stringToDate(date));
    }

    /**
     * 获取日期的月份。失败返回0。
     *
     * @param date 日期
     * @return 月份
     */
    public static int getMonth(Date date) {
        return getInteger(date, Calendar.MONTH);
    }

    /**
     * 获取日期的天数。失败返回0。
     *
     * @param date 日期字符串
     * @return 天
     */
    public static int getDay(String date) {
        return getDay(stringToDate(date));
    }

    /**
     * 获取日期的天数。失败返回0。
     *
     * @param date 日期
     * @return 天
     */
    public static int getDay(Date date) {
        return getInteger(date, Calendar.DATE);
    }

    /**
     * 获取日期的小时。失败返回0。
     *
     * @param date 日期字符串
     * @return 小时
     */
    public static int getHour(String date) {
        return getHour(stringToDate(date));
    }

    /**
     * 获取日期的小时。失败返回0。
     *
     * @param date 日期
     * @return 小时
     */
    public static int getHour(Date date) {
        return getInteger(date, Calendar.HOUR_OF_DAY);
    }

    /**
     * 获取日期的分钟。失败返回0。
     *
     * @param date 日期字符串
     * @return 分钟
     */
    public static int getMinute(String date) {
        return getMinute(stringToDate(date));
    }

    /**
     * 获取日期的分钟。失败返回0。
     *
     * @param date 日期
     * @return 分钟
     */
    public static int getMinute(Date date) {
        return getInteger(date, Calendar.MINUTE);
    }

    /**
     * 获取日期的秒钟。失败返回0。
     *
     * @param date 日期字符串
     * @return 秒钟
     */
    public static int getSecond(String date) {
        return getSecond(stringToDate(date));
    }

    /**
     * 获取日期的秒钟。失败返回0。
     *
     * @param date 日期
     * @return 秒钟
     */
    public static int getSecond(Date date) {
        return getInteger(date, Calendar.SECOND);
    }

    /**
     * 获取日期 。默认yyyy-MM-dd格式。失败返回null。
     *
     * @param date 日期字符串
     * @return 日期
     */
    public static String getDate(String date) {
        return stringToString(date, DateStyle.YYYY_MM_DD);
    }

    /**
     * 获取日期。默认yyyy-MM-dd格式。失败返回null。
     *
     * @param date 日期
     * @return 日期
     */
    public static String getDate(Date date) {
        return dateToString(date, DateStyle.YYYY_MM_DD);
    }

    /**
     * 获取日期。默认yyyy年MM月dd日格式。失败返回null。
     *
     * @param date
     * @return
     */
    public static String getDateFormat(Date date) {
        return dateToString(date, DateStyle.YYYY_MM_DD_CC);
    }

    /**
     * 获取日期。默认yyyy-MM-dd HH:mm:ss格式。失败返回null。
     *
     * @param date 日期
     * @return 日期
     */
    public static String getDateTime(Date date) {
        return dateToString(date, DateStyle.YYYY_MM_DD_HH_MM_SS);
    }

    /**
     * 获取日期。默认mm格式。失败返回null。
     *
     * @param date 日期
     * @return 日期
     */
    public static String getMM(Date date) {
        return dateToString(date, "MM");
    }

    /**
     * 获取日期。默认yyyyMMdd。
     *
     * @param date 日期
     * @return 日期
     */
    public static String getDate1(Date date) {
        return dateToString(date, "yyyyMMdd");
    }

    /**
     * 获取往年年份。默认yyyy格式。失败返回null。
     *
     * @param date
     * @param num
     * @return
     */
    public static Integer getDateYear(Date date, Integer num) {

        return Integer.parseInt(dateToString(date, DateStyle.YYYY)) + num;
    }

    /**
     * 获取日期的时间。默认HH:mm:ss格式。失败返回null。
     *
     * @param date 日期字符串
     * @return 时间
     */
    public static String getTime(String date) {
        return stringToString(date, DateStyle.HH_MM_SS);
    }

    /**
     * 获取日期的时间。默认HH:mm:ss格式。失败返回null。
     *
     * @param date 日期
     * @return 时间
     */
    public static String getTime(Date date) {
        return dateToString(date, DateStyle.HH_MM_SS);
    }


    /**
     * 获取两个日期相差的天数
     *
     * @param date      日期字符串
     * @param otherDate 另一个日期字符串
     * @return 相差天数
     */
    public static int getIntervalDays(String date, String otherDate) {
        return getIntervalDays(stringToDate(date), stringToDate(otherDate));
    }

    /**
     * @param date      日期
     * @param otherDate 另一个日期
     * @return 相差天数
     */
    public static int getIntervalDays(Date date, Date otherDate) {
        date = DateUtil.stringToDate(DateUtil.getDate(date));
        long time = Math.abs(date.getTime() - otherDate.getTime());
        return (int) (time / (24 * 60 * 60 * 1000));
    }

    /**
     * @param
     * @return nameEnShort
     */
    public static Date parse(String dateStr) {
        return parse(dateStr, YYYY_MM_DD, null);
    }

    /**
     * @param
     * @return nameEnShort
     */
    public static Date parse(String dateStr, String pattern) {
        return parse(dateStr, pattern, null);
    }

    /**
     * @param
     * @return nameEnShort
     */
    public static Date parse(String dateStr, String pattern, Date defaultValue) {
        if (dateStr == null || "".equals(dateStr)) {
            return defaultValue;
        }

        SimpleDateFormat format = new SimpleDateFormat(pattern);
        try {
            return format.parse(dateStr);
        } catch (ParseException e) {
            return defaultValue;
        }
    }

    /**
     * @param
     * @return nameEnShort
     */
    public static String format(Date date) {
        return format(date, YYYY_MM_DD);
    }

    /**
     * @param
     * @return nameEnShort
     */
    public static String format(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            return format.format(date);
        } else {
            return null;
        }
    }

    /**
     * @param
     * @return nameEnShort
     */
    public static Date addDay1(Date date, int day) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_MONTH, day);

        return c.getTime();
    }

    /**
     * @param date
     * @return nameEnShort
     */
    public static Date addMonth1(Date date, int month) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.MONTH, month);

        return c.getTime();
    }

    /**
     * 获取昨天的日期
     *
     * @return Date 返回类型
     * @Title getYesterday
     */
    public static Date getYesterday() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        date = calendar.getTime();
        return date;
    }

    /**
     * 获取昨天的日期
     *
     * @return Date 返回类型
     * @Title getYesterday
     */
    public static Date getSevenDaysAgo() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, -7);
        date = calendar.getTime();
        return date;
    }

    /**
     * 获取n天以前的日期
     *
     * @param day
     * @return
     */
    public static Date getDaysAgo(int day) {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, -1 * day);
        date = calendar.getTime();
        return date;
    }

    /**
     * 带服务器时区的时间日期
     *
     * @return
     */
    public static Date getLocalDateTime() {
        LocalDateTime localDateTime = LocalDateTime.now();
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDateTime.atZone(zone).toInstant();
        Date date = Date.from(instant);
        return date;
    }

    /**
     * @param date1
     * @param date2
     * @Description: 比较两个时间的大小
     * Date: 2020-02-22 10:12:10
     */
    public static boolean compareDate(Date date1, Date date2) {
        if (date1.before(date2)) {
            return false;
        } else if (date1.after(date2)) {
            return true;
        } else {
            return true;
        }
    }

    /**
     * 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
     *
     * @param nowTime   当前时间
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
        if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
            return true;
        }
        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(startTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获得当前日期 yyyy-MM-dd HH:mm:ss
     *
     * @return 2019-11-19 14:12:40
     */
    public static Date getDateCurrentTime(String str) {
        // 小写的hh取得12小时,大写的HH取的是24小时
        SimpleDateFormat df = new SimpleDateFormat(str);
        Date date = new Date();
        try {
            date = df.parse(df.format(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    public static Date getDateTime(String str) {
        // 小写的hh取得12小时,大写的HH取的是24小时
        SimpleDateFormat df = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
        Date date = new Date();
        try {
            date = df.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 传入格式 yyyyMMdd
     * @param date 传入格式 yyyyMMdd
     * @return  返回格式yyyy-MM-dd hh:mm:ss
     */
    public static String getTimeStamp(String date) {
        String y = date.substring(0, 4);
        String m = date.substring(4, 6);
        String d = date.substring(6, 8);
        StringBuffer sf = new StringBuffer();
        sf.append(y).append("-").append(m).append("-").append(d).append(" ").append("00:00:00");
        long ss = stringToDate(sf.toString()).getTime();
        return String.valueOf(ss);
    }

    /**
     * 传入格式 yyyyMMdd
     * @param date 传入格式 yyyyMMdd
     * @return  返回格式yyyy-MM-dd
     */
    public static String getDayStamp(String date) {
        String y = date.substring(0, 4);
        String m = date.substring(4, 6);
        String d = date.substring(6, 8);
        StringBuffer sf = new StringBuffer();
        sf.append(y).append("-").append(m).append("-").append(d);
        return sf.toString();
    }

    /**
     * 日期字符串或时间戳处理,
     * yyyy-MM-dd转成yyyyMMdd
     * 时间戳数字转换yyyyMMdd
     * @param date
     * @return 返回 yyyyMMdd
     */
    public static String dateStringFormt(String date) {
        if (ObjectUtil.isEmpty(date)) {
            return "";
        }
        if (date.indexOf("-") > 0) {
            return date.replaceAll("-", "").substring(0, 8);
        }
        if (StringUtils.isNumeric(date) && date.length() > 8) {
            Date date2 = DateUtils.getDate(Long.parseLong(date));
            String dataStr = com.springboot.cloud.msp.common.core.util.DateUtil.dateToString(date2, com.springboot.cloud.msp.common.core.util.DateUtil.YYYYMMDD);
            // System.out.println(date + "==>日期转换:" + dataStr);
            return dataStr;
        }
        return date;
    }

    /**
     * 时间戳转日期
     *
     * @param s
     * @return
     */
    public static Date transForDate(Long s) {
        if (s == null) {
            s = (long) 0;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date temp = null;
        if (s != null) {
            try {
                String str = sdf.format(s);
                temp = sdf.parse(str);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return temp;
    }

    /**
     * 取得指定日期是多少周
     * 最后一周跨年,则将这周算作下一年第一周
     */
    public static String getWeekStrOfYear(Date date, int weekFirstDay) {
        Calendar c = new GregorianCalendar();
        c.setFirstDayOfWeek(weekFirstDay);
        c.setMinimalDaysInFirstWeek(1);
        c.setTime(date);
        Calendar c2 = new GregorianCalendar();
        c2.setTime(getLastDayOfWeek(c.getTime(), weekFirstDay));
        return c2.get(Calendar.YEAR) + StringUtils.leftPad(c.get(Calendar.WEEK_OF_YEAR) + "", 2, "0");
    }

    /**
     * 取得指定日期所在周的最后一天
     *
     * @param date
     * @param weekFirstDay Calendar.MONDAY,Calendar.SUNDAY
     * @return
     */
    public static Date getLastDayOfWeek(Date date, int weekFirstDay) {
        Calendar c = new GregorianCalendar();
        c.setFirstDayOfWeek(weekFirstDay);
        c.setTime(date);
        c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
        return c.getTime();
    }

    /**
     * 得到某年某周的最后一天
     *
     * @param year
     * @param week
     * @param weekFirstDay Calendar.MONDAY,Calendar.SUNDAY
     * @return
     */
    public static Date getLastDayOfWeek(int year, int week, int weekFirstDay) {
        Calendar c = new GregorianCalendar();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, Calendar.JANUARY);
        c.set(Calendar.DATE, 1);

        Calendar cal = (GregorianCalendar) c.clone();
        cal.add(Calendar.DATE, (week - 1) * 7);

        return getLastDayOfWeek(cal.getTime(), weekFirstDay);
    }

    /**
     * 根据日期字符串判断当月第几周
     *
     * @param str
     * @return
     * @throws Exception
     */
    public static int getWeek(String str) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(str);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //第几周
        int week = calendar.get(Calendar.WEEK_OF_YEAR);
        //第几天,从周日开始
       // int day = calendar.get(Calendar.DAY_OF_WEEK);
        return week;
    }

    //时间区间补全方法
    public static List<String> findDates(String beginTime, int num)
            throws ParseException {
        List<String> allDate = new ArrayList();
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        String endTime = getOtherTime(beginTime+ " 00:00:00", num);
        Date dBegin = sdf.parse(beginTime);
        Date dEnd = sdf.parse(endTime);
        allDate.add(sdf.format(dBegin)); //.replaceAll("-",""))
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())) {
            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
            allDate.add(sdf.format(calBegin.getTime())); //.replaceAll("-","")
        }
        return allDate;
    }

    //时间区间补全方法
    public static List<String> findDates_1(String beginTime, String endTime)
            throws ParseException {
        List<String> allDate = new ArrayList();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Date dBegin = sdf.parse(beginTime+ " 00:00:00");
        Date dEnd = sdf.parse(endTime+ " 00:00:00");
        allDate.add(sdf.format(dBegin)); //.replaceAll("-",""))
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())) {
            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
            allDate.add(sdf.format(calBegin.getTime())); //.replaceAll("-","")
        }
        return allDate;
    }


    /**
     *
     * @param data yyyy-MM-dd
     * @return  yyyy-MM-dd
     */
    public static String getOtherTime(String data,int num){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();

        //过去七天
        c.setTime(getDateTime(data+ " 00:00:00"));
        c.add(Calendar.DATE, num);
        Date d = c.getTime();
        String day = format.format(d);
        return day;
    }

    /**
     *
     * @param data
     * @param num
     * @return  MM.dd
     */
    public static String getOtherTime1(String data,int num){
        SimpleDateFormat format = new SimpleDateFormat("MM.dd");
        Calendar c = Calendar.getInstance();

        //过去七天
        c.setTime(getDateTime(data));
        c.add(Calendar.DATE, num);
        Date d = c.getTime();
        String day = format.format(d);
        return day;
    }

    /**
     *
     * @param data
     * @param num
     * @return  yyyyMMdd
     */
    public static Integer getOtherTime2(String data,int num){
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Calendar c = Calendar.getInstance();

        //过去七天
        c.setTime(getDateTime(data));
        c.add(Calendar.DATE, num);
        Date d = c.getTime();
        String day = format.format(d);
        return StringUtils.isNotEmpty(day) ? Integer.parseInt(day): 0;
    }

    /**
     * 统计时间段
     * @param data yyyy-MM-dd
     * @param num
     * @return
     */
    public static String getOtherTimeAnd(String data,int num){
        String startTime = data.substring(5,10).replaceAll("-","\\.");
        String endTime = getOtherTime1(data ,num);
        StringBuffer sf = new StringBuffer();
        sf.append(startTime).append("~").append(endTime.replaceAll("-",""));
        return sf.toString();
    }


    /**
     * 获取当天为周几
     * @param date yyyy-MM-dd
     * @return
     */
    public static Integer getDayWeek(String date){
        String endTime = date + " 00:00:00";
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(getDateTime(endTime));
        int weekIdx = calendar.get(Calendar.DAY_OF_WEEK) - 1;

        return weekIdx;
    }


    /**
     * 获取某月的最后一天
     *
     */
    public static String getLastDayOfMonth(int year,int month){
        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR,year);
        //设置月份
        cal.set(Calendar.MONTH, month);
        //获取当月最小值
        int lastDay = cal.getMinimum(Calendar.DAY_OF_MONTH);
        //设置日历中的月份,当月+1月-1天=当月最后一天
        cal.set(Calendar.DAY_OF_MONTH, lastDay-1);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("MM.dd");
        String lastDayOfMonth = sdf.format(cal.getTime());
        return lastDayOfMonth;
    }

    /**
     *  获取某月的最后一天
     * @param year
     * @param month
     * @return  yyyy-MM-dd
     */
    public static String getLastDayOfMonthyyyyMMdd(int year,int month){
        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR,year);
        //设置月份
        cal.set(Calendar.MONTH, month);
        //获取当月最小值
        int lastDay = cal.getMinimum(Calendar.DAY_OF_MONTH);
        //设置日历中的月份,当月+1月-1天=当月最后一天
        cal.set(Calendar.DAY_OF_MONTH, lastDay-1);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String lastDayOfMonth = sdf.format(cal.getTime());
        return lastDayOfMonth;
    }

    /**
     * 获取上一月或下一月
     * time yyyy-MM-dd hh:mm:ss
     * @return
     */
    public static String getPreMonth(String time,int num) {
        Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
        ca.setTime(getDateTime(time));   //设置时间为当前时间
     //   ca.add(Calendar.YEAR, +1); //年份+1
         ca.add(Calendar.MONTH, num); // 月份-1
        Date date = ca.getTime();
        String mm = getMM(date);

        return mm;
    }


    public static void main(String[] args) throws ParseException,Exception {
		/*String nowDay = "2020-11-15 12:12:11";
		String startDay = "2020-11-15 00:00:00";
		String endDay = "2020-12-15 00:00:00";

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		Date nowDate = sdf.parse(nowDay);
		Date startDate = sdf.parse(startDay);
		Date endDate = sdf.parse(endDay);*/
      /*  String day = "20161124";
        String y = day.substring(0, 4);
        String m = day.substring(4, 6);
        String d = day.substring(6, 8);
        System.err.println("y:" + y);
        System.err.println("m:" + m);
        System.err.println("d:" + d);
        System.err.println("day:" + getTimeStamp(day));

        Date date = transForDate(1640793600000L);
        System.err.println("9999>>>>" + date);

        String d1 = getDate1(new Date());
        System.err.println("777>>>>" + d1);

        System.err.println("时间: " + getWeek("2022-1-30"));*/

/*        System.err.println("时间补全:" + findDates("2022-02-01",7));
      //  System.err.println("8888888:" + getOtherTime("2022-11-01 00:00:00",8));

        System.err.println("22222>>>>" +getOtherTimeAnd("2022-02-01",7));
        System.err.println("5555>>>>" +getDayWeek("2022-11-05"));

        System.err.println("getLastDayOfMonth>>>>" +getLastDayOfMonth(2022,9));
        System.err.println("getMonthPreDay>>>>" +getPreMonth("2020-12-15 12:12:11",1));
        System.err.println("dateToString>>>>" +dateToString(new Date(),"yyyy-MM-dd"));

        System.err.println("5555>>>>" + getOtherTime("2022-11-16 00:00:00",2));

        System.err.println("周:"+getDayWeek("2022-11-18"));
        System.err.println("年:"+DateUtil.dateToString(new Date(),"yyyy"));
        System.err.println("年11:"+"20221205".substring(0,4));*/

/*        List<String> findDates = DateUtil.findDates(DateUtil.getDayStamp("2022-11-28"), 1);
        System.err.println("dddd>>>>"+findDates);*/

        String  s = getOtherTime1("2022-11-28 00:00:00",0);
        System.err.println("dddd>>>" + s);

    }
}

猜你喜欢

转载自blog.csdn.net/bug_love/article/details/130367613