dateUtil日期工具类

日期工具类

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author smile.zhao
 * @version 1.0
 * @date 2024/7/25 12:00
 */
@Slf4j
public class ProductDateUtil {

    /**
     * 判断日期是否合法
     *
     * @param dateStr
     * @return
     */
    public static boolean isLegalDate(String dateStr) {
        String format = "yyyy-MM-dd";
        if (ObjectUtil.isEmpty(dateStr)) {
            return false;
        }
        try {
            DateUtil.parse(dateStr, format);
            return true;
        } catch (Exception e) {
            log.error("日期格式错误:", e);
            return false;
        }
    }

    /**
     * 获取前一天日期
     *
     * @param: dateTime 入参是当前时间2020-03-01
     * @return: 返参是前一天的日期, 理应为2020-02-29(闰年)
     */
    public static String getBeforeLastDay(String dateTime) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = simpleDateFormat.parse(dateTime);
        } catch (ParseException e) {
            log.error("String转Date日期失败:", e);
            throw new RuntimeException("String转Date日期失败");
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //往前一天
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        return simpleDateFormat.format(calendar.getTime());
    }

    /**
     * 获取前一个月的第一天
     *
     * @param dateTime
     * @return
     */
    public static String getBeforeLastMonthStart(String dateTime) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(simpleDateFormat.parse(dateTime));
        } catch (ParseException e) {
            log.error("String转Date日期失败:", e);
            throw new RuntimeException("String转Date日期失败");
        }
        c.add(Calendar.MONTH, -1);
        return simpleDateFormat.format(c.getTime());
    }

    /**
     * 获取前一个月的最后一天
     *
     * @param dateTime
     * @return
     */
    public static String getBeforeLastMonthEnd(String dateTime) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(simpleDateFormat.parse(dateTime));
        } catch (ParseException e) {
            log.error("String转Date日期失败:", e);
            throw new RuntimeException("String转Date日期失败");
        }
        c.add(Calendar.MONTH, 0);
        c.set(Calendar.DAY_OF_MONTH, 0);
        return simpleDateFormat.format(c.getTime());
    }

    /**
     * 获取指定时间的对应的周一的日期
     *
     * @param dateTime
     * @return
     */
    public static String getDateOfWeekStart(String dateTime) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date d = null;
        try {
            d = simpleDateFormat.parse(dateTime);
        } catch (ParseException e) {
            log.error("String转Date日期失败:", e);
        }
        Calendar ca = Calendar.getInstance();
        ca.setTime(d);
        int year = ca.get(Calendar.YEAR);
        int mon = ca.get(Calendar.MONTH) + 1;
        int day = ca.get(Calendar.DAY_OF_MONTH);
        LocalDate date = LocalDate.of(year, mon, day);
        while (date.getDayOfWeek() != DayOfWeek.MONDAY) {
            date = date.minusDays(1);
        }
        log.info("本周周一的日期:" + date);
        return date.toString();
    }

    /**
     * 获取今天日期
     *
     * @return
     */
    public static String getTodayDate() {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(calendar.getTime());
        return format;
    }

    /**
     * 获取指定时间的周日的日期
     *
     * @param dateTime
     * @return
     */
    public static String getDateOfWeekEnd(String dateTime) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date d = null;
        try {
            d = simpleDateFormat.parse(dateTime);
        } catch (ParseException e) {
            log.error("String转Date日期失败:", e);
        }
        Calendar ca = Calendar.getInstance();
        ca.setTime(d);
        int year = ca.get(Calendar.YEAR);
        int mon = ca.get(Calendar.MONTH) + 1;
        int day = ca.get(Calendar.DAY_OF_MONTH);
        LocalDate date = LocalDate.of(year, mon, day);
        while (date.getDayOfWeek() != DayOfWeek.SUNDAY) {
            date = date.plusDays(1);
        }
        log.info("本周周日的日期:" + date);
        return date.toString();
    }

    /**
     * 获取7天前的日期
     *
     * @return
     */
    public static String getTheDayBeforeSevenDay() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 在当前日基础上-1
        calendar.add(Calendar.DAY_OF_MONTH, -7);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(calendar.getTime());
        return format;
    }

    /**
     * 获取14天前的日期
     *
     * @return
     */
    public static String getTheDayBeforeFourteenDay() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 在当前日基础上-1
        calendar.add(Calendar.DAY_OF_MONTH, -14);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(calendar.getTime());
        return format;
    }

    /**
     * 获取8天前的日期
     *
     * @return
     */
    public static String getTheDayBeforeEightDay() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 在当前日基础上-1
        calendar.add(Calendar.DAY_OF_MONTH, -8);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(calendar.getTime());
        return format;
    }

    /**
     * 获取30天前的日期
     *
     * @return
     */
    public static String getTheDayBeforeThirtyDay() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 在当前日基础上-1
        calendar.add(Calendar.DAY_OF_MONTH, -30);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(calendar.getTime());
        return format;
    }

    /**
     * 获取31天前的日期
     *
     * @return
     */
    public static String getTheDayBeforeThirtyOneDay() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 在当前日基础上-1
        calendar.add(Calendar.DAY_OF_MONTH, -31);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(calendar.getTime());
        return format;
    }

    /**
     * 获取60天前的日期
     *
     * @return
     */
    public static String getTheDayBeforeSixtyDay() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 在当前日基础上-1
        calendar.add(Calendar.DAY_OF_MONTH, -60);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(calendar.getTime());
        return format;
    }

    /**
     * 获取两个日期之间的天数
     *
     * @param startDay
     * @param endDay
     * @return
     */
    public static int getCycleDate(String startDay, String endDay) {
        DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
        int i = 0;
        try {
            //开始时间
            Date star = dft.parse(startDay);
            //结束时间
            Date end = dft.parse(endDay);
            Date nextDay = star;
            //当明天不在结束时间之前是终止循环
            if (end.before(nextDay)) {
                return -1;
            }
            while (nextDay.before(end)) {
                Calendar cld = Calendar.getInstance();
                cld.setTime(star);
                cld.add(Calendar.DATE, 1);
                star = cld.getTime();
                //获得下一天日期字符串
                nextDay = star;
                i++;
            }
            System.out.println("相差天数为:" + i);
        } catch (ParseException e) {
            log.error("日期转换失败:", e);
            throw new RuntimeException("日期转换失败");
        }
        return i;
    }

    /**
     * 自定义日期上一个周期开始时间
     *
     * @param startDay
     * @param endDay
     * @return
     */
    public static String getCustomStartDay(String startDay, String endDay) {
        int cycleDate = getCycleDate(startDay, endDay);
        if (cycleDate < 0) {
            log.error("日期差范围不合法");
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(startDay);
        } catch (ParseException e) {
            log.info("日期转换失败:", e);
            throw new RuntimeException("日期转换失败");
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 在当前日基础上-1
        calendar.add(Calendar.DAY_OF_MONTH, -(cycleDate + 1));
        String format = sdf.format(calendar.getTime());
        return format;
    }


    /**
     * 自定义日期上一个周期结束时间
     *
     * @param startDay
     * @param endDay
     * @return
     */
    public static String getCustomEndDay(String startDay, String endDay) {
        int cycleDate = getCycleDate(startDay, endDay);
        if (cycleDate < 0) {
            log.error("日期差范围不合法");
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(endDay);
        } catch (ParseException e) {
            log.info("日期转换失败:", e);
            throw new RuntimeException("日期转换失败");
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 在当前日基础上-1
        calendar.add(Calendar.DAY_OF_MONTH, -(cycleDate + 1));
        String format = sdf.format(calendar.getTime());
        return format;
    }

    /**
     * 获取两个日期之间的日期集合
     *
     * @param startDay
     * @param endDay
     * @return
     */
    public static List<String> getDatesBetweenTwoDates(String startDay, String endDay) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List<String> datesInRange = new ArrayList<>();
        Calendar calendar = new GregorianCalendar();
        try {
            calendar.setTime(sdf.parse(startDay));
        } catch (ParseException e) {
            log.error("日期转换失败:", e);
        }
        Calendar endCalendar = new GregorianCalendar();
        try {
            endCalendar.setTime(sdf.parse(endDay));
        } catch (ParseException e) {
            log.error("日期转换失败:", e);
            throw new RuntimeException(e);
        }

        while (calendar.before(endCalendar)) {
            Date result = calendar.getTime();
            datesInRange.add(sdf.format(result));
            calendar.add(Calendar.DATE, 1);
        }
        return datesInRange;
    }

    /**
     * 获取上12个月的日期
     *
     * @param month
     * @return
     */
    public static List<String> getPrevious12Months(String month) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        try {
            calendar.setTime(sdf.parse(month));
        } catch (ParseException e) {
            log.error("日期转换失败:", e);
            throw new RuntimeException(e);
        }
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        Date firstDayOfMonth = calendar.getTime();
        month = sdf.format(firstDayOfMonth);
        List<String> previousMonths = new ArrayList<>();
        LocalDate currentDate = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        for (int i = 0; i < 12; i++) {
            currentDate = currentDate.minusMonths(1);
            String formattedDate = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            previousMonths.add(formattedDate);
        }
        if (previousMonths.size() == 12) {
            previousMonths.add(month);
        }
        return previousMonths.stream().sorted().collect(Collectors.toList());
    }


    /**
     * 获取上12周的日期
     * @param startDay
     * @return
     */
    public static List<String> getPrevious12Weeks(String startDay) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        List<String> previousWeeks = new ArrayList<>();
        try {
            calendar.setTime(sdf.parse(startDay));
        } catch (ParseException e) {
            log.error("日期转换失败:", e);
            throw new RuntimeException("日期转换失败");
        }
        for (int i = 0; i < 12; i++) {
            // 获取本周的周一
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            String start = sdf.format(calendar.getTime());
            previousWeeks.add(start);
            //LocalDate currentDate = LocalDate.parse(start, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            //LocalDate sunday = currentDate.with(DayOfWeek.SUNDAY);
            //String end = df.format(sunday);
            //System.out.println("本周的周一:" + start + ",本周的周日:" + end);
//            // 获取本周的周日
//            calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
//            String end = sdf.format(calendar.getTime());
//            System.out.println("本周的周一:" + start + ",本周的周日:" + end);
            calendar.add(Calendar.WEEK_OF_YEAR, -1);
        }
        return previousWeeks.stream().sorted().collect(Collectors.toList());
    }

    public static void main(String[] args) {
        List<String> previous12Weeks = getPrevious12Weeks("2024-07-16");
        previous12Weeks.forEach(System.out::println);
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值