MonthDay专为表示无年份的月日设计,适合生日等场景;支持直接创建、提取当前月日、比较是否为今天、处理闰年2月29日及格式化解析。

MonthDay.now() 获取的是当前系统日期的月日部分,它本身不包含年份,天生就适合表示生日这类只关心月日的场景。
直接用 MonthDay 表示生日
MonthDay 就是专为“月+日”设计的不可变类型,比如生日、纪念日等不需要年份的日期片段:
- 它不带年份,避免误用年份参与计算(比如不会出现“2025年2月29日”这种无效日期)
- 创建时可直接传入月份和日期:
MonthDay.of(12, 25)表示12月25日 - 从当前日期提取月日:
MonthDay today = MonthDay.now();—— 这就是今天对应的“月日”
验证生日是否是今天
判断某人生日(如 10月15日)是不是今天,只需比较 MonthDay 对象:
MonthDay birthday = MonthDay.of(10, 15);boolean isToday = birthday.equals(MonthDay.now());- 无需考虑年份,也不用构造 LocalDate 再截取,安全又简洁
处理闰年生日(2月29日)
MonthDay 允许合法表示 2月29日(MonthDay.of(2, 29)),但要注意:
立即学习“Java免费学习笔记(深入)”;
- 它本身不校验是否为有效日期(不依赖具体年份),所以创建无异常
- 若需转换为真实日期(如今年生日是哪天),可结合 Year 使用:
birthday.atYear(2024).toString()→ "2024-02-29";而birthday.atYear(2023)→ "2023-02-28"(自动顺延)
格式化与解析月日
默认 toString() 输出为 --MM-dd 格式(如 --12-25),符合 ISO-8601 对月日的规范:
- 解析字符串:
MonthDay.parse("--07-04")或MonthDay.parse("07-04", DateTimeFormatter.ofPattern("MM-dd")) - 自定义输出:
birthday.format(DateTimeFormatter.ofPattern("M月d日"))→ "7月4日"


















