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);
}
}
日期工具类
最新推荐文章于 2025-08-08 22:01:10 发布