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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:13:45