You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将字符串转为Calendar对象时日期解析错误问题求助

问题原因及解决方案

你遇到的问题完全是因为SimpleDateFormat的格式字符串使用错误导致的,我来帮你拆解一下问题所在:

错误点分析

  • YYYY 应该改为 yyyy:
    YYYY 代表的是「基于周的年份(Week Year)」,它的计算从当年第一周开始,而第一周的定义是包含当年第一个星期四的那一周,这会导致日期在跨年周时出现偏差。我们日常使用的公历年份应该用小写的 yyyy。

  • DD 应该改为 dd:
    DD 是「一年中的第几天(Day of Year)」,比如1月1日是001,12月31日是365/366。而你要表示的是「月份中的第几天」,必须用小写的 dd。

  • hh 建议改为 HH:
    hh 是12小时制的小时数,如果你输入的是上午9:04,这里不会出错,但如果是下午时间(比如14:00)就会解析错误。如果你的时间是24小时制,应该用大写的 HH。

修正后的代码

把格式字符串改成 "yyyy-MM-dd HH:mm:ss" 就可以解决问题了,修正后的代码如下:

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    cal.setTime(sdf.parse("2019-08-21 9:04:08"));
} catch (ParseException e) {
    e.printStackTrace();
}
return cal;

这样解析出来的日期就会是正确的 Wed Aug 21 09:04:08 GMT 2019 了。

另外,如果你使用的是Java 8及以上版本,更推荐使用java.time包下的新日期API(比如LocalDateTime、DateTimeFormatter),它们是线程安全的,也更易用:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse("2019-08-21 9:04:08", formatter);
// 如果需要转换成Calendar对象(兼容旧代码)
Calendar cal = Calendar.getInstance();
cal.setTime(Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()));
return cal;

内容的提问来源于stack exchange,提问作者Daniel Haughton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:14:51