LocalDate.getDayOfWeek() 返回 DayOfWeek 枚举实例,非数字或字符串;需用 getValue() 获取1~7,getDisplayName(TextStyle.FULL, Locale.CHINA) 获取中文名称;比较应使用 == DayOfWeek.MONDAY;月份参数为1~12,推荐用 Month 枚举避免错误。

LocalDate.getDayOfWeek() 返回的是 DayOfWeek 枚举,不是数字或字符串
直接调用 getDayOfWeek() 不会返回 1~7 或 "Monday" 这类原始值,而是返回 DayOfWeek 枚举实例。这是最容易误解的一点:很多人期望它返回 int,结果在 if 判断或日志里打印出 MONDAY 却没意识到这是枚举对象。
常见错误现象:System.out.println(date.getDayOfWeek() == 1) 永远为 false;或者用 date.getDayOfWeek().toString() 得到全大写英文(如 "TUESDAY"),不符合中文界面需求。
- 若需数字(ISO 标准:周一=1,周日=7),调用
dayOfWeek.getValue() - 若需本地化星期名(如中文“星期一”),用
dayOfWeek.getDisplayName(TextStyle.FULL, Locale.CHINA) - 避免直接用
==比较枚举和 int/字符串;应使用== DayOfWeek.MONDAY或.equals()
构造 LocalDate 时注意月份从 1 开始,不是 0
Java 的 LocalDate.of(year, month, day) 中 month 是 1~12,和 Calendar 的 0~11 完全不同。传入 LocalDate.of(2024, 2, 15) 表示 2024 年 2 月 15 日;若误写成 LocalDate.of(2024, 1, 15) 就成了 1 月而非 2 月 —— 这类低级错误常导致算错星期几。
- 推荐用
Month枚举提高可读性:LocalDate.of(2024, Month.FEBRUARY, 15) - 从字符串解析时,用
LocalDate.parse("2024-02-15")更安全,无需手动拆分 - 如果输入是年/月/日三个 int 变量,务必确认 month 值范围是否合法(
1 )
处理跨时区或本地化显示时不要依赖 getDayOfWeek() 直接输出
getDayOfWeek() 返回的始终是 ISO 日历下的星期(周一为第一天),与系统时区无关,也与用户语言环境无关。但它不自动适配“周日为一周开始”的地区习惯(如美国),也不转成中文。
立即学习“Java免费学习笔记(深入)”;
- 要按用户 locale 显示星期名,必须显式调用
getDisplayName(),并传入对应Locale - 如果业务逻辑需要“周日为第 1 天”,不能硬编码
getValue() % 7 + 1,而应改用WeekFields.of(Locale.US).dayOfWeek()配合get() - 注意
Locale.CHINA和Locale.SIMPLIFIED_CHINESE效果一致,但前者更明确意图
性能与线程安全:DayOfWeek 是不可变枚举,可放心复用
DayOfWeek 是 JDK 内置的 enum,所有实例(MONDAY~SUNDAY)都是单例、final、线程安全的。每次调用 getDayOfWeek() 返回的只是对已有对象的引用,没有对象创建开销。
- 不需要缓存
DayOfWeek实例,也不必担心高频调用影响性能 - 但别把
getDayOfWeek()放在循环内反复计算同一日期——应先提取再复用 - 若需批量判断多个日期是否为周末,建议用
dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY,比字符串匹配快且类型安全


















