解析有效日期时出现 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 建立的模式:"Thu, 08 Jan 2015 21:16:44 GMT"
- 这种情况只发生在数百个生产中的两个客户身上。一个是 Samsung Galaxy Note 8,另一个是 Samsung Galaxy 3。
- 日期来自 HTTP 请求的响应 header。其余客户端使用的 HTTP 服务器相同,仅在这两个设备上失败。
所以,这是一个很大的谜团。有什么想法吗?
问题是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
我收到两个 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 建立的模式:"Thu, 08 Jan 2015 21:16:44 GMT"
- 这种情况只发生在数百个生产中的两个客户身上。一个是 Samsung Galaxy Note 8,另一个是 Samsung Galaxy 3。
- 日期来自 HTTP 请求的响应 header。其余客户端使用的 HTTP 服务器相同,仅在这两个设备上失败。
所以,这是一个很大的谜团。有什么想法吗?
问题是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