如何将字符串日期转为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
相关产品推荐
相关产品推荐

