星期转换Date格式错误

昨天在测试环境上发现一个报错,错误如下

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值