我收到两个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)
所以,这是一个很大的谜团。有什么想法吗?
答案 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