在Java中自定义日期处理是开发中常见的需求,尤其是当内置的日期时间API无法满足特定格式或业务逻辑时,Java提供了多种方式实现日期自定义,从传统的Date和SimpleDateFormat到Java 8引入的java.time包,开发者可以根据场景选择合适的方法。

使用SimpleDateFormat进行自定义格式化
SimpleDateFormat是Java早期处理日期格式化的核心类,允许通过模式字符串自定义日期格式。yyyy-MM-dd表示“年-月-日”,HH:mm:ss表示“时:分:秒”,使用时需注意线程安全问题,因为SimpleDateFormat是非线程安全的,建议在多线程环境下使用ThreadLocal或每次创建新实例。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String formattedDate = sdf.format(new Date());
System.out.println(formattedDate); // 输出:2023年10月01日 15时30分45秒
通过Calendar类调整日期字段
Calendar类提供了更灵活的日期操作方式,可以获取或修改日期的年、月、日等字段,自定义“某年某月的第一天”可通过以下方式实现:
Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 2023); calendar.set(Calendar.MONTH, 9); // 月份从0开始,9表示10月 calendar.set(Calendar.DAY_OF_MONTH, 1); Date firstDayOfMonth = calendar.getTime();
Java 8的DateTimeFormatter实现自定义格式
Java 8引入的java.time包彻底革新了日期时间处理,其中DateTimeFormatter是线程安全的格式化类,支持更丰富的自定义模式,带星期的日期格式:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd EEEE");
LocalDate date = LocalDate.now();
String formattedDate = date.format(formatter); // 输出:2023-10-01 星期日
自定义日期解析与计算
java.time包中的LocalDate、LocalDateTime等类提供了强大的日期计算能力,自定义“计算两个日期之间的工作日”:
LocalDate startDate = LocalDate.of(2023, 10, 1);
LocalDate endDate = LocalDate.of(2023, 10, 7);
long workDays = startDate.datesUntil(endDate)
.filter(d -> !d.getDayOfWeek().equals(DayOfWeek.SATURDAY)
&& !d.getDayOfWeek().equals(DayOfWeek.SUNDAY))
.count();
System.out.println("工作日天数:" + workDays);
处理时区与国际化日期
若需自定义带时区的日期或国际化格式,可使用ZonedDateTime和DateTimeFormatter的本地化模式,格式化不同语言的月份名称:
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("MMMM yyyy", Locale.CHINA);
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
String localizedDate = zonedDateTime.format(formatter); // 输出:十月 2023
自定义日期工具类封装
为提高代码复用性,可以封装自定义日期工具类,实现“获取指定日期的月初/月末”方法:

public class DateUtils {
public static LocalDate getFirstDayOfMonth(LocalDate date) {
return date.withDayOfMonth(1);
}
public static LocalDate getLastDayOfMonth(LocalDate date) {
return date.withDayOfMonth(date.lengthOfMonth());
}
}
通过以上方法,开发者可以灵活应对各种日期自定义需求,推荐在Java 8及以上的版本中使用java.time包,其设计更现代、线程安全且功能强大,对于遗留代码中的Date和SimpleDateFormat,可逐步迁移至新的API以提升代码质量和可维护性。