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

如何将字符串日期转为Calendar类型?代码输出异常求验证

问题分析与解决方案

这个输出完全不正确,问题的核心是你的日期格式化模式和输入字符串的格式不匹配,导致解析逻辑彻底混乱了。

错误原因拆解

你输入的字符串是"2003-08-15",格式是年-月-日(yyyy-MM-dd),但你创建SimpleDateFormat时用的模式是"dd-MM-yyyy"(日-月-年)。这就相当于告诉程序:把字符串里的第一部分当成日,第二部分当成月,第三部分当成年。

按照这个错误的模式解析"2003-08-15"时,程序会尝试把2003作为日、08作为月、15作为年。但15年的8月根本没有2003天,Calendar会自动进行日期滚动调整——把多余的天数转换成月份、年份,最终就得到了你看到的那个完全不符合预期的"0021-01-22 12:30:00"。

修正后的代码

只需要把格式化模式改成和输入字符串匹配的"yyyy-MM-dd"即可:

String a1 = "2003-08-15";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
try {
    Date date = formatter.parse(a1);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    item.setDate1(calendar);
} catch (ParseException e) {
    // 建议添加异常处理,比如提示日期格式错误
    e.printStackTrace();
}

更推荐的Java 8+方案

如果你的项目使用Java 8及以上版本,强烈建议使用java.time包下的新日期API(线程安全、设计更合理),再转成Calendar(如果业务必须用Calendar的话):

String a1 = "2003-08-15";
// 直接解析成LocalDate,无需指定格式(因为输入符合ISO标准)
LocalDate localDate = LocalDate.parse(a1);
Calendar calendar = Calendar.getInstance();
// 注意:Calendar的月份是从0开始的,LocalDate是从1开始的,所以要减1
calendar.set(localDate.getYear(), localDate.getMonthValue() - 1, localDate.getDayOfMonth());
item.setDate1(calendar);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:17:30