记录使用DateTimeFormatter不当造成的一次生产事故
最近做了个需求:用户上传身份证后识别身份证信息,校验姓名、身份证号、手机号三者是否一致,同时限制年龄不能大于65岁。问题出在“限制年龄不能大于65岁”这部分。
通常我日期格式化都是这样定义:
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
我用了自己身份证测试没问题,测试也没测出来。但是上线后发现大量用户身份证识别失败。后来通过查看服务器日志发现有个打印“出生日期识别失败”,找到相关代码是写了个根据生日计算年龄的方法抛出的异常。
异常原因: 我包括测试几个人的生日月份和日都是两位数,按上面定义的DateTimeFormatter进行格式化如果入参月和日是一位数,前面没补充0会抛异常
解决方法:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy年M月d日")// 允许月份和日不补零
.toFormatter(Locale.CHINESE);
总结:
- 习惯性直接写DateTimeFormatter.ofPattern,没搞清楚用法
- 对异常处理过于随便,用try/catch包裹了大块代码,导致其中的方法虽然处理了异常,但是最终抛出的是最外层的异常,无法精准定位问题