Java调用Calendar类获取日期星期值输出错误问题排查
问题原因
- 核心错误是
SimpleDateFormat的日期模式符使用错误:小写m代表的是分钟,大写M才代表月份。 - 你写的
"dd/mm/yyyy"模式会把输入27/09/2021里的09解析为分钟,月份字段没有对应输入就会取默认值1月,最终得到的是2021年1月27日0点09分的日期对象,这个日期实际是周三,所以DAY_OF_WEEK返回值为4,和你预期的9月27日周一完全不符。
修复方案
方案1:直接修正原有代码的日期模式
把SimpleDateFormat的初始化代码改为:
SimpleDateFormat myFormat = new SimpleDateFormat("dd/MM/yyyy");
修改后就能正确解析出2021年9月27日的日期,后续取星期的结果也会对应正确。
注意:
SimpleDateFormat是线程不安全的,不要定义为全局静态变量在多线程环境下共用。
方案2(更推荐,Java 8+适用):使用java.time新日期API
Java 8之后推出的新日期API解决了旧API线程不安全、设计混乱的问题,代码示例如下:
public static void function(String newDate){ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); LocalDate date = LocalDate.parse(newDate, formatter); // 获取星期枚举,直接判断是否为周末 DayOfWeek dayOfWeek = date.getDayOfWeek(); System.out.println(dayOfWeek); // 输出 MONDAY System.out.println(dayOfWeek.getValue()); // 输出1(新API周一为1,周日为7,更符合日常认知) // 判断是否为周末示例 if(dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY){ System.out.println("是周末"); } }
内容的提问来源于stack exchange,提问作者william_
相关产品推荐
相关产品推荐

