LocalDate.getDayOfWeek() 返回 DayOfWeek 枚举,需用 getDisplayName(TextStyle, Locale) 本地化显示;中文必须显式传 Locale.CHINA,FULL 得“星期一”,SHORT 得“周一”,NARROW 得“一”;LocalDate 本身无时区,跨日逻辑须先转 ZonedDateTime 再取 LocalDate。

LocalDate.getDayOfWeek() 返回的是 DayOfWeek 枚举,不是字符串
调用 getDayOfWeek() 得到的是 DayOfWeek 枚举实例(如 DayOfWeek.MONDAY),不是 “周一” 或 “Monday”。直接 toString() 会输出英文大写名称("MONDAY"),不支持本地化,也不符合中文 UI 需求。
常见错误是写成:localDate.getDayOfWeek().toString(),结果固定为英文全大写,且无法随 Locale 变化。
- 正确做法是调用
getDisplayName(TextStyle, Locale) -
TextStyle.SHORT→ “周一” / “Mon”;TextStyle.FULL→ “星期一” / “Monday” - 必须显式传入
Locale,例如Locale.CHINA或Locale.US
中文显示必须用 Locale.CHINA,不能用 Locale.getDefault()
Locale.getDefault() 在服务器环境常为 en_US 或空值,即使客户端是中文系统,JVM 启动参数或容器配置也可能覆盖它。依赖默认值会导致本地化失效。
- 显示中文星期:用
Locale.CHINA(等价于new Locale("zh", "CN")) - 避免
new Locale("zh")—— 缺少国家码可能导致某些 JDK 版本回退到英文 - JDK 8+ 对
Locale.CHINA的中文星期翻译是稳定的,包括 “星期一” 和 “周一”
示例:localDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINA) → 返回 "星期一"
TextStyle.SHORT 与 FULL 在中文下的实际差异
中文环境下两者的区别很具体,不是“短/长”那么简单:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
TextStyle.FULL→"星期一"(带“星期”前缀,正式场景常用) -
TextStyle.SHORT→"周一"(日常 UI 更紧凑,日历控件常用) -
TextStyle.NARROW→"一"(仅单字,适合表头窄列,但需注意语义模糊)
别误以为 SHORT 是拼音缩写或英文缩写——它按 Locale 规则生成,Locale.CHINA 下就是 “周一”,不是 “ZhouYi” 或 “Mon”。
时区无关,但 LocalDate 本身不含时区信息
LocalDate 是纯日期,无时间、无时区,所以 getDayOfWeek() 的结果只取决于年月日数值,和系统时区、JVM 时区设置完全无关。这点常被误解。
- 不需要转换时区,也不需要
ZonedDateTime或Instant - 若你手头是
Instant或Timestamp,先用atZone(ZoneId.systemDefault())转成ZonedDateTime,再取toLocalDate(),否则直接截断会丢失“当天星期”的上下文(比如 UTC 时间 2024-05-01T16:00:00Z 对应北京时间是 5月2日) - 跨日逻辑必须明确指定
ZoneId,否则LocalDate无法自行推断
本地化显示星期这件事,真正复杂的地方不在格式化,而在确保你拿到的 LocalDate 确实是你想表达的那个“本地日期”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










