日期工具类

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * 日期工具类
 * 1、addDaysToDateString(String dateStr,int daysInt) 将给定的日期字符串加上某些天,并返回新的日期字符串。
 * 2、addDaysToDateNow(int daysInt) 给当前的日期加上某些天,并返回新的日期字符串。
 * 3、compareDateStrings(String dateStr1, String dateStr2) 比较两个日期字符串。
 * 4、compareDateStrings(String dateStr) 比较当前日期和给定的日期字符串。
 * 5、daysBetween(String dateStr1, String dateStr2) 计算两个日期字符串之间的间隔天数。
 * 6、parseDate(String dateStr) 将给定的日期字符串解析成日期格式。
 * 7、getLastDayOfMonth(String dateStr) 获取指定日期所在月份的最后一天。
 * 8、getLastDayOfYear(String dateStr) 获取指定日期所在年份的最后一天。
 * 9、getDayOfWeek(String dateStr) 根据给定的日期字符串判断是星期几。
 * 10、formatDate(Date date, String pattern)  把日期格式化为pattern字符串
 * 11、getPreviousDate(String dateStr, int daysBack) 根据指定日期往前推若干天,获得日期字符串。
 */
public class DateUtils {

    // 默认的日期格式
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    /**
     * 将给定的日期字符串加上某些天,并返回新的日期字符串。
     * @param dateStr  输入的日期字符串,格式为 "yyyy-MM-dd"
     * @param daysInt  输入需要加的天数,格式 int
     * @return 加上某些天后的日期字符串,格式为 "yyyy-MM-dd"
     */
    public static String addDaysToDateString(String dateStr,int daysInt) {
        if (dateStr == null || dateStr.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }
        LocalDate date = LocalDate.parse(dateStr, DATE_FORMATTER);
        LocalDate newDate = date.plus(daysInt, ChronoUnit.DAYS);
        return newDate.format(DATE_FORMATTER);
    }
    /**
     * 给当前的日期加上某些天,并返回新的日期字符串。
     * @param daysInt  输入需要加的天数,格式 int
     * @return 加上某些天后的日期字符串,格式为 "yyyy-MM-dd"
     */
    public static String addDaysToDateNow(int daysInt) {
        LocalDate date = LocalDate.now();
        LocalDate newDate = date.plus(daysInt, ChronoUnit.DAYS);
        return newDate.format(DATE_FORMATTER);
    }
    /**
     * 比较两个日期字符串。
     *
     * @param dateStr1 第一个日期字符串,格式为 "yyyy-MM-dd"
     * @param dateStr2 第二个日期字符串,格式为 "yyyy-MM-dd"
     * @return 如果dateStr1早于dateStr2返回-1,如果dateStr1晚于dateStr2返回1,相等返回0
     */
    public static int compareDateStrings(String dateStr1, String dateStr2) {
        if (dateStr1 == null || dateStr1.isEmpty() || dateStr2 == null || dateStr2.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }
        LocalDate date1 = LocalDate.parse(dateStr1, DATE_FORMATTER);
        LocalDate date2 = LocalDate.parse(dateStr2, DATE_FORMATTER);

        return date1.compareTo(date2);
    }
    /**
     * 比较当前日期和给定的日期字符串。
     *
     * @param dateStr 日期字符串,格式为 "yyyy-MM-dd"
     * @return 如果当前日期早于dateStr返回-1,如果当前日期晚于dateStr返回1,相等返回0
     */
    public static int compareDateStrings(String dateStr) {
        if (dateStr == null || dateStr.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }

        LocalDate date1 = LocalDate.now();
        LocalDate date2 = LocalDate.parse(dateStr, DATE_FORMATTER);

        return date1.compareTo(date2);
    }
    /**
     * 计算两个日期字符串之间的间隔天数。
     *
     * @param dateStr1 第一个日期字符串,格式为 "yyyy-MM-dd"。
     * @param dateStr2 第二个日期字符串,格式为 "yyyy-MM-dd"。
     * @return 两个日期之间的间隔天数 long。
     * @throws IllegalArgumentException 如果提供的日期字符串格式不正确。
     */
    public static long daysBetween(String dateStr1, String dateStr2) {
        if (dateStr1 == null || dateStr1.isEmpty() || dateStr2 == null || dateStr2.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }
        LocalDate startDate = LocalDate.parse(dateStr1, DATE_FORMATTER);
        LocalDate endDate = LocalDate.parse(dateStr2, DATE_FORMATTER);
        return Math.abs(ChronoUnit.DAYS.between(startDate, endDate));
    }

    /**
     * 将给定的日期字符串解析成日期格式
     * @param dateStr 日期字符串,格式为 "yyyy-MM-dd"。
     * @return 日期格式 比如:"Fri Dec 20 00:00:00 CST 2024"
     * @throws ParseException
     */
    public static Date parseDate(String dateStr) throws ParseException {
        if (dateStr == null || dateStr.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }
        return new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
    }
    /**
     * 获取指定日期所在月份的最后一天。
     *
     * @param dateStr 指定的日期 "yyyy-MM-dd"。
     * @return 指定日期所在月份的最后一天的日期字符串。
     */
    public static String getLastDayOfMonth(String dateStr) {
        if (dateStr == null || dateStr.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }
        LocalDate oldDate = LocalDate.parse(dateStr, DATE_FORMATTER);
        YearMonth yearMonth = YearMonth.from(oldDate);
        LocalDate newDate = yearMonth.atEndOfMonth();

        return newDate.format(DATE_FORMATTER);
    }
    /**
     * 获取指定日期年份的最后一天。
     *
     * @param dateStr 指定的日期 "yyyy-MM-dd"。
     * @return 指定日期所在年份的最后一天的日期字符串。
     */
    public static String getLastDayOfYear(String dateStr) {
        if (dateStr == null || dateStr.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }
        // 创建 Year 对象表示指定年份
        Year specifiedYear = Year.of(Integer.parseInt(dateStr.substring(0,4)));
        // 使用 atMonth 和 atEndOfMonth 方法来获得该年12月的最后一天
        LocalDate lastDayOfYear = specifiedYear.atMonth(Month.DECEMBER).atEndOfMonth();

        return lastDayOfYear.format(DATE_FORMATTER);
    }

    /**
     * 根据给定的日期判断是星期几。
     * @param dateStr 给定的日期字符串,格式为 "yyyy-MM-dd"。
     * @return 该日期对应的星期几(例如:星期一、星期二等)。
     */
    public static String getDayOfWeek(String dateStr) {
        if (dateStr == null || dateStr.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }
        LocalDate oldDate = LocalDate.parse(dateStr, DATE_FORMATTER);
        // 获取该日期是星期几,并转换为中文表示
        DayOfWeek dayOfWeek = oldDate.getDayOfWeek();
        return translateDayOfWeek(dayOfWeek);
    }
    /**
     * 将 DayOfWeek 枚举值翻译成中文。
     *
     * @param dayOfWeek DayOfWeek 枚举值。
     * @return 中文表示的星期几。
     */
    private static String translateDayOfWeek(DayOfWeek dayOfWeek) {
        switch (dayOfWeek) {
            case MONDAY:    return "星期一";
            case TUESDAY:   return "星期二";
            case WEDNESDAY: return "星期三";
            case THURSDAY:  return "星期四";
            case FRIDAY:    return "星期五";
            case SATURDAY:  return "星期六";
            case SUNDAY:    return "星期日";
            default:        return "未知";
        }
    }

    /**
     * 把日期格式化为pattern字符串
     * @param date  日期格式
     * @param pattern 格式  比如:"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"
     * @return
     */
    public static String formatDate(Date date, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }
    /**
     * 根据指定日期往前推若干天,获得日期字符串。
     *
     * @param dateStr  给定的日期字符串,格式为 "yyyy-MM-dd"。
     * @param daysBack 要往前推的天数。
     * @return 前推若干天后的日期的日期字符串。
     */
    public static String getPreviousDate(String dateStr, int daysBack) {
        if (dateStr == null || dateStr.isEmpty()) {
            throw new IllegalArgumentException("日期字符串不能为null或空");
        }
        LocalDate oldDate = LocalDate.parse(dateStr, DATE_FORMATTER);
        LocalDate newDate = oldDate.minusDays(daysBack);
        // 往前推若干天
        return newDate.format(DATE_FORMATTER);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值