1. getDayOfMonth()
- 方法定义
public int getDayOfMonth()
- 功能说明
返回日期在当月中的天数(范围:1–31)。 - 示例代码
LocalDate date = LocalDate.of(2023, 12, 25); int day = date.getDayOfMonth(); // 返回 25
- 使用场景
生成账单日期、计算当月截止日等。 - 注意事项
结果与月份长度相关(如 2 月最多 29 天)。
2. getDayOfYear()
- 方法定义
public int getDayOfYear()
- 功能说明
返回日期在当前年份中的天数(范围:1–366,闰年 366 天)。 - 示例代码
LocalDate date = LocalDate.parse("2024-02-29"); // 闰年 int dayOfYear = date.getDayOfYear(); // 返回 60(31 + 29)
- 使用场景
计算年度进度、生成季度报告等。 - 常见错误
忽略闰年影响(如 2023 年 12 月 31 日返回 365,2024 年同日期返回 366)。
3. getDayOfWeek()
- 方法定义
public DayOfWeek getDayOfWeek()
- 功能说明
返回DayOfWeek
枚举值(MONDAY
到SUNDAY
),表示星期几。 - 示例代码
LocalDate date = LocalDate.of(2023, 12, 25); DayOfWeek weekday = date.getDayOfWeek(); // 返回 DayOfWeek.MONDAY String name = weekday.name(); // "MONDAY" int value = weekday.getValue(); // 1 (星期一) 到 7 (星期日)
- 使用技巧
- 比较星期:
date.getDayOfWeek() == DayOfWeek.SATURDAY
- 获取本地化名称:
String cnName = weekday.getDisplayName(TextStyle.FULL, Locale.CHINA); // "星期一"
- 比较星期:
关键注意事项与最佳实践
不可变性
所有方法均不修改原对象,返回新值:LocalDate date = LocalDate.now(); int day = date.getDayOfMonth(); // 安全,date 不变
空指针安全
LocalDate
不可为null
,否则抛出NullPointerException
:// 错误示例 LocalDate date = null; int day = date.getDayOfMonth(); // NPE!
闰年处理
使用Year.isLeap(year)
显式检查闰年:boolean isLeap = Year.of(2024).isLeap(); // true
性能优化
- 多次调用同一日期的
getDayOfXxx()
时,缓存结果(虽然方法本身轻量)。 - 避免在循环中重复创建
LocalDate
对象。
- 多次调用同一日期的
时区影响
LocalDate
无时区概念,需确保业务逻辑与预期时区一致:LocalDate today = LocalDate.now(ZoneId.of("Asia/Shanghai"));
总结与快速实践指南
方法 | 返回类型 | 范围 | 典型应用场景 |
---|---|---|---|
getDayOfMonth() |
int |
1–31 | 当月特定日期操作 |
getDayOfYear() |
int |
1–366 | 年度统计、进度计算 |
getDayOfWeek() |
DayOfWeek |
MONDAY–SUNDAY | 星期相关逻辑(如调休) |
实践建议:
- 优先使用
DayOfWeek
枚举而非数字,增强可读性。 - 结合
TemporalAdjusters
处理复杂日期逻辑(如下个周一):LocalDate nextMonday = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
- 始终校验日期合法性(如
2023-02-30
会抛出DateTimeException
)。