在java中经常使用SimpleDateFormat来解析日期字符串,我在使用过程中发现一个意外的现象,当SimpleDateFormat指定yyyy-MM-dd HH:mm:ss.SSS格式,解析2025-01-15 10:16:00.123123的时候,给出的时间是2025-01-15 10:18:03.123,这不是我预期的结果,预期的结果是2025-01-15 10:16:00.123。
这是怎么回事呢?打着研究透彻的想法,我看了下jdk的实现源码。SimpleDateFormat的内部实现是采用Calendar类来构造日期的,在SimpleDateFormat里有个成员是PATTERN_INDEX_TO_CALENDAR_FIELD,这个成员将SimpleDateFormat解析出来的年月日时分秒毫秒tag转为Calendar中对应的fieldNo,然后将日期字符串中的值一个个设置到Calendar里。
这里就是出问题的地方,SimpleDateFormat会将整个123123认为是毫秒设置进Calendar中,如此计算123123就是123秒123毫秒,这就导致分钟数增加了。