解析有效日期时出现ParseException

时间:2015-01-09 10:25:27

标签: java android parsing http-headers simpledateformat

我收到两个Android客户端在解析HTTP响应日期时遇到问题的报告。我正在记录客户端尝试解析的日期,这非常好。

解析日期的块是:

    public Date parseDateInHeader(String dateHeader) throws ParseException {
       SimpleDateFormat simpledateformat = new SimpleDateFormat("EEE, dd MMM yyyy kk:mm:ss 'GMT'");
       simpledateformat.setTimeZone(TimeZone.getTimeZone("GMT"));
       return simpledateformat.parse(dateHeader);
   }

我的崩溃报告系统中记录的异常是:

Caused by: java.text.ParseException: Unparseable date: "Thu, 08 Jan 2015 21:16:44 GMT" (at offset 0)
   at java.text.DateFormat.parse(DateFormat.java:555)
   at com.mycompany.api.util.DateUtils.parseDateInHeader(DateUtils.java:45)
   at com.mycompany.api.network.procedure.NetworkProcedure.getResponseHeaders(NetworkProcedure.java:54)
   at com.mycompany.api.network.procedure.GetNetworkProcedure.run(GetNetworkProcedure.java:58)
   at com.mycompany.api.network.procedure.GetNetworkProcedure.run(GetNetworkProcedure.java:43)
   at com.mycompany.api.network.procedure.Procedure.checkedRun(Procedure.java:26)
   at com.mycompany.api.impl.BaseMendeleySdk.getDocumentTypes(BaseMendeleySdk.java:235)
   at com.mycompany.sync.SyncRequest.syncDocumentTypes(SyncRequest.java:80)
   at com.mycompany.sync.SyncRequest.sync(SyncRequest.java:57)
   at com.mycompany.sync.SyncControllerImpl$1.doInBackground(SyncControllerImpl.java:82)
   at com.mycompany.sync.SyncControllerImpl$1.doInBackground(SyncControllerImpl.java:77)
   at android.os.AsyncTask$2.call(AsyncTask.java:288)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
   at java.lang.Thread.run(Thread.java:841)
  • 正如您所看到的,我正在解析的字符串完全有效,并遵循为SimpleDateFormat建立的模式:“星期四,2015年1月8日21:16:44 GMT”
  • 仅在生产中的数百个客户中发生这种情况。一个是三星Galaxy Note 8,另一个是三星Galaxy 3。
  • 日期来自HTTP请求的响应标头。 HTTP服务器与其他客户端使用的相同,只有这两个设备才会失败。

所以,这是一个很大的谜团。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

问题是SimpleDateFormat使用手机的Locale进行解析,而我没有在SimpleDateFormat的构造函数中指定Locate,因此,它采用的是设备的Locale,它与日期的格式不兼容

解决它的方法是在SimpleDateFormat的构造函数中将US作为Locale传递,因为HTTP服务器以英语打印星期几:

SimpleDateFormat simpledateformat = new SimpleDateFormat("EEE, dd MMM yyyy kk:mm:ss 'GMT'", Locale.US);

该设备具有西班牙语语言环境,并且使用西班牙语" Thu"一周不存在。

感谢Michael Konietza的回答here

答案 1 :(得分:1)

在这种情况下,你需要传递适当的Locale