输入只有月和日时,先补上年份再构造 LocalDate。下面同时接受 9.1、9.01 和 09.01,并检查闰年与无效日期。

需要 JDK 8 或更高版本。保存为 DateDemo.java:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
public class DateDemo {
public static LocalDate parseDate(String text, int year) {
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("M.d")
.parseDefaulting(ChronoField.YEAR, year)
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT);
try {
return LocalDate.parse(text, formatter);
} catch (DateTimeParseException e) {
throw new IllegalArgumentException("无效日期:" + text, e);
}
}
public static void main(String[] args) {
System.out.println(parseDate("9.01", 2026));
System.out.println(parseDate("2.29", 2024));
}
}
Terminal window
javac -encoding UTF-8 DateDemo.java
java DateDemo

输出 2026-09-01 和 2024-02-29。把第二个年份改为 2025 会抛出异常,因为该年不是闰年。

parse 把文字解析为日期,format 把日期格式化为文字。TemporalAccessor 是解析结果的通用接口,但不是处理这类输入的唯一方式。