Java中DOY转日期时,DOY=1场景返回年份错误问题排查
问题原因与解决方案
问题根源
你遇到的年份显示错误,核心原因是日期格式化时误用了YYYY模式:
YYYY代表周年(Week Year),它的规则是:以包含当年第一个星期四的星期为周年的起始周。2023年1月1日是星期日,属于2022年的最后一个周年周(2022年12月29日是当年最后一个星期四),因此用YYYY格式化时会显示2022。- 1月2日及之后的日期属于2023年的周年周,所以
YYYY显示正常,这就是为什么只有DOY=1时出问题。
解决方法
将格式化模式中的YYYY替换为yyyy,yyyy代表公历纪年的年份,符合日常使用的年份逻辑。
修改第一种实现(Java 8+ DateTime API)
// 原代码 // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.YYYY EEE"); // 修改后 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy EEE");
修改第二种实现(Calendar + SimpleDateFormat)
// 原代码 // SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.YYYY HH:mm:ss EEE"); // 修改后 SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss EEE");
修改后,调用getDateFromDoy(1,2023)会正确返回01.01.2023 So.(星期显示随本地化设置变化)。
内容的提问来源于stack exchange,提问作者Nisbo
相关产品推荐
相关产品推荐

