SimpleDateFormat时间格式转换坑

SimpleDateFormat时间格式转换坑


近日项目里碰到一个SimpleDateFormat时间格式转换的问题,代码类似为:

SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
            String dateStr = "2019-10-27";
            //前端传值
            Date date = format.parse(dateStr);

            SimpleDateFormat format2 = new SimpleDateFormat("yyyyMMdd");
            //传给另外一方
            System.out.println("date:"+format2.format(date));

输出

date:20190127

月份变成1月了???Debug看下
在这里插入图片描述
确实是1月,那我们传过去的10月哪去了?仔细查看代码还有看Debug结果,发现原来两次格式化设置的格式不一样,第一次 SimpleDateFormat 的格式是 yyyy-mm-dd 月份格式设成了mm,mm是分钟,再观察我们的结果(见上图)确实分钟位是10,相当于月份没有传值,SimpleDateFormat给默认了1月,现在真相大白了,真是矮凳子绊死人啊,所以我们一定要谨慎编码,做好代码review。
日期/时间格式中的字母及其含义与示例

字母 含义 示例
y 年份 一般用 yy 表示两位年份,yyyy 表示 4 位年份;使用 yy 表示的年份,如 11;使用 yyyy 表示的年份,如 2011
M 月份 一般用 MM 表示月份,如果使用 MMM,则会根据语言环境显示不同语言的月份 使用 MM 表示的月份,如 05;使用 MMM 表示月份,在 Locale.CHINA语言环境下,如“十月”;在 Locale.US语言环境下,如 Oct
d 月份中的天数 一般用 dd 表示天数 使用 dd 表示的天数,如 10
D 年份中的天数 表示当天是当年的第几天, 用 D 表示 使用 D 表示的年份中的天数,如 295
E 星期几 用 E 表示,会根据语言环境的不同, 显示不同语言的星期几 使用 E 表示星期几,在 Locale.CHINA 语言环境下,如“星期四”;在 Locale.US 语言环境下,如 Thu
H 一天中的小时数(24小时制) 一般用 HH 表示小时数 使用 HH 表示的小时数,如 18
h 一天中的小时数(12小时制) 一般使用hh表 示小时数 使用 hh 表示的小时数,如 10 (注意 10 有可能是 10 点,也可能是 22 点)
m 分钟数 一般使用 mm 表示分钟数 使用 mm 表示的分钟数,如 29
s 秒数 一般使用 ss 表示秒数 使用 ss 表示的秒数,如 38
S 毫秒数 一般使用 SSS 表示毫秒数 使用 SSS 表示的毫秒数,如 156

码字不易,希望有助于他人~

发布了5 篇原创文章 · 获赞 0 · 访问量 86

猜你喜欢

转载自blog.csdn.net/clsq0913/article/details/102769860