Date转换中的一个容易忽略的低级错误

A problem of date transfer

Posted by qingshan on May 17, 2019

在程序中,经常涉及到时间格式的转换。在转换的时候,无一例外需要用到格式转换字符串。典型的转换字符串分别代表的含义如下:

  • yyyy:年
  • MM:月
  • dd:日
  • hh:1~12小时制(1-12)
  • HH:24小时制(0-23)
  • mm:分
  • ss:秒
  • S:毫秒
  • E:星期几
  • D:一年中的第几天
  • F:一月中的第几个星期(会把这个月总共过的天数除以7)
  • w:一年中的第几个星期
  • W:一月中的第几星期(会根据实际情况来算)
  • a:上下午标识
  • k:和HH差不多,表示一天24小时制(1-24)
  • K:和hh差不多,表示一天12小时制(0-11)
  • z:表示时区

最近工作中在时间转换的时候犯了各低级错误。代码如下:

Java时间转换

1
2
long timestamp = 1557885600000L;
String timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss").format(new Date(timestamp));

转换出来的结果

1
2019-05-15 10:05:00

错误现象: 当日期为整点时候,结果正常。其他时间,分针永远是05分。让人百思不得其解。 最终,发现原来是把表示分钟的字符串mm写成了大写的MM,这样一来,本来应该是分针的地方,表示的是当月的日期。

因为测试的时候,使用整点为测试用例的。因此测试没有测出来,上线后才发现问题。到Debug的时候,还是使用整点为测试,没发现异常。还以为是遇到某个灵异事件了。最终才注意到这个大小写字符串上面。耽误了许多的精力。

在此记录一下,提醒自己,细节出魔鬼啊!!!