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 枚举值(MONDAYSUNDAY),表示星期几。
  • 示例代码
    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); // "星期一"
      

关键注意事项与最佳实践

  1. 不可变性
    所有方法均不修改原对象,返回新值:

    LocalDate date = LocalDate.now();
    int day = date.getDayOfMonth(); // 安全,date 不变
    
  2. 空指针安全
    LocalDate 不可为 null,否则抛出 NullPointerException

    // 错误示例
    LocalDate date = null;
    int day = date.getDayOfMonth(); // NPE!
    
  3. 闰年处理
    使用 Year.isLeap(year) 显式检查闰年:

    boolean isLeap = Year.of(2024).isLeap(); // true
    
  4. 性能优化

    • 多次调用同一日期的 getDayOfXxx() 时,缓存结果(虽然方法本身轻量)。
    • 避免在循环中重复创建 LocalDate 对象。
  5. 时区影响
    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)。