昨天在测试环境上发现一个报错,错误如下
Caused by: java.lang.RuntimeException: java.text.ParseException: Unparseable date: "2017年8月9日(星期三) 17:43"
at cn.fraudmetrix.octopus.sdk.service.base.util.DateUtil.string2Date(DateUtil.java:45)
at cn.fraudmetrix.octopus.sdk.service.spider.biz.util.AliyunUtils.transAliyunEmailInfo(AliyunUtils.java:40)
at cn.fraudmetrix.octopus.sdk.service.spider.biz.util.AliyunUtils.lambda$transSearchRespAliyun$9(AliyunUtils.java:67)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$Itr.forEachRemaining(ArrayList.java:891)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at cn.fraudmetrix.octopus.sdk.service.spider.biz.util.AliyunUtils.transSearchRespAliyun(AliyunUtils.java:67)
at cn.fraudmetrix.octopus.sdk.service.spider.biz.crawler.email.aliyun.AliyunSearchCrawler.doParse(AliyunSearchCrawler.java:41)
at cn.fraudmetrix.octopus.sdk.service.spider.biz.crawler.AbstractCrawler.parseResponse(AbstractCrawler.java:47)
... 11 common frames omitted
Caused by: java.text.ParseException: Unparseable date: "2017年8月9日(星期三) 17:43"
这明显是一个日期类型转换错误,经查找代码如下
receivedDate = DateUtil.date2String(DateUtil.string2Date(receivedDate, "yyyy年MM月dd日(EEEE) HH:mm"),
DateUtil.PATTERN_YYYYMMDDHHMMSS);
也就是说是把”2017年8月9日(星期三) 17:43”转为Date的时候报错,但经过测试发现我本地这个转换并没有问题
经本地测试后发现,问题出现在星期上,也就是把”(星期三)”按”(EEEE)”格式转化时报错
在两个同事的机器上做测试,一个报错,一个运行通过。发现报错的同事电脑操作系统是英文,后经过仔细研究发现报错同事电脑的地区选择的是美国,我和另外一个运行正常的同事地区选的是中国
因此推测是否是地区问题,我电脑地区更改为美国之后代码也报错,至此问题找到,原因是美国的星期格式为英语,若想按此格式转化成功星期必须是英文,如下
那如何解决呢
日期转换时指定地区
远代码
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
更改后
//指定地区为中国
SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.CHINA);
但此在我们的工程中此方法是公共方法,长久考虑这样更改是有弊病的(很多地方调这方法,以后可能美国有自己的格式调这个代码就会出错)
最后在实际工程中我把星期去掉了,再进行格式化,这样只影响我自己的代码,把影响降到最小
if(receivedDate.contains("(")){
receivedDate = receivedDate.replaceAll("\\(.*?\\)","");
}
receivedDate = DateUtil.date2String(DateUtil.string2Date(receivedDate, "yyyy年MM月dd日 HH:mm"),
DateUtil.PATTERN_YYYYMMDDHHMMSS);