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

