SimpleDateFormat解析异常:始终返回1月,但反向格式化正常
问题分析与解决:SimpleDateFormat解析日期始终返回1月的问题
嘿,这个问题我太熟了——你这是踩了SimpleDateFormat格式符大小写的经典坑!
问题根源
你用的格式串"mm-dd-yyyy"里,小写的mm代表的是分钟,不是月份!月份对应的正确格式符是大写的MM。
看你的日志就能明白:比如输入02-13-2017,解析后的Date是Fri Jan 13 00:02:00 GMT+03:00 2017——这里的分钟数是02,正好对应你输入的第一个部分02,而因为没有正确解析月份字段,SimpleDateFormat默认把月份设成了1月(Jan)。
为什么格式化回去结果“正确”?
这是因为你格式化时还是用的"mm-dd-yyyy",它会把Date对象里的分钟值取出来转成两位数,刚好和你原本输入的“月份”部分数值一致,所以看起来结果没问题,但实际上Date对象的月份是完全错误的。
修正后的代码
把格式串里的mm改成MM就搞定了:
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy", Locale.ENGLISH); Date date = formatter.parse(changeDate); Log.d("Tag", changeDate); Log.d("Tag", date.toString()); Log.d("Tag", formatter.format(date));
额外建议(Java 8+)
如果你的项目用的是Java 8及以上版本,非常推荐使用java.time包下的日期API,它们不仅线程安全,格式符的语义也更清晰,能避免这类大小写混淆的问题:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; // ... DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH); LocalDate date = LocalDate.parse(changeDate, formatter); System.out.println(changeDate); System.out.println(date.toString()); System.out.println(formatter.format(date));
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

