Calendar.get(Calendar.YEAR)返回错误年份的问题求助
问题根源与修复方案
嘿,这个坑我之前也踩过!问题出在你日期格式字符串里的大写YYYY——你应该用小写的yyyy才对。
为什么会出错?
yyyy是我们日常使用的公历年(格里高利历年份),完全匹配你的需求。YYYY代表的是周年(Week Year),它的计算逻辑是基于周的:每年的第一周必须至少包含4天。这就会导致部分日期(比如跨年前后的周)的周年和公历年不一致。你的日期是2019年5月11日,按说周年也该是2019,但可能因为JVM时区或Calendar的周计算规则,解析时错误匹配到了2018的周年——不过不管怎样,换成yyyy就能彻底解决这个问题。
修复后的代码
把格式字符串里的YYYY替换成yyyy即可:
class Test{ public static void main(String[] args) { String dateStr = "May 11, 2019 11:35:34 AM"; SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a"); try{ Date d1 = format.parse(dateStr); Calendar cal = Calendar.getInstance(); cal.setTime(d1); System.out.println(cal.get(Calendar.YEAR)); // 现在会正确输出2019 // 顺便提一句:你代码里的System.out.println(Calendar.YEAR); 输出的是常量值1,这不是你想要的年份,记得删掉或者修正哦 }catch (Exception e){ e.printStackTrace(); } } }
额外推荐(更优方案)
如果你用的是Java 8及以上版本,真心建议换掉老旧的SimpleDateFormat和Calendar,改用java.time包下的新日期API——它们线程安全,API设计更清晰,不容易踩坑。给你写个示例:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; class Test{ public static void main(String[] args) { String dateStr = "May 11, 2019 11:35:34 AM"; // 注意这里用hh(12小时制)对应AM/PM,比HH更规范 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy hh:mm:ss a"); LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter); System.out.println(dateTime.getYear()); // 稳稳输出2019 } }
内容的提问来源于stack exchange,提问作者Drizzy
相关产品推荐
相关产品推荐

