解析有效日期时出现 ParseException

ParseException when parsing valid date

我收到两个 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);
   }

我的 crash-reporting 系统中记录的异常是:

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.doInBackground(SyncControllerImpl.java:82)
   at com.mycompany.sync.SyncControllerImpl.doInBackground(SyncControllerImpl.java:77)
   at android.os.AsyncTask.call(AsyncTask.java:288)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at android.os.AsyncTask$SerialExecutor.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使用了phone的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

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