我正在开发一个与某些 Google App Engine 网络服务对话的 Android 应用程序。
此应用程序实现了一个具有非常简单功能的聊天 Activity :发送文本。
在调试过程中,我注意到我从服务器列出的消息的显示顺序与我在应用程序中发送的顺序不同。我的第一个想法是问题出在服务器上。
起初我检查了我收到的原始 Json:
{
"messages": [
{
"message": "test 3",
"author": "daniel",
"message_id": "5724160613416960",
"sent_at": "2014-11-13T09:42:42.861950"
},
{
"message": "test 2",
"author": "daniel",
"message_id": "5649050225344512",
"sent_at": "2014-11-13T09:42:10.390960"
},
{
"message": "test 1",
"author": "daniel",
"message_id": "5178081291534336",
"sent_at": "2014-11-13T09:41:01.998830"
}
],
"kind": "company#chatsItem",
"etag": "\"RUCkC9XynEQNZ2t5E0aa41edXro/xRNtgkWIUbq4zCgmv2iq2fy-UIg\""
}
如您所见,原始数据已正确排序。但有趣的部分来了。当我添加一个 JSON 解析器时,例如 JacksonFactory(甚至 GsonFactory):
Company.Builder builder = new Company.Builder(AndroidHttp.newCompatibleTransport(), new JacksonFactory(), null);
Company service = builder.build();
ChatsChatCollectionResponse response = service.chats().list(user_id, album_id, token).execute();
List<ChatsChatResponse> messagesResponse = response.getMessages();
以下是按上述相同方式排序的 ChatsChatResponse
项:
[0] = {com.appspot.com_pany.company.model.ChatsChatResponse@830029063096} size = 4
[0] = {com.google.api.client.util.DataMap$Entry@830029082528}"author" -> "daniel"
[1] = {com.google.api.client.util.DataMap$Entry@830029082552}"message" -> "test 3"
[2] = {com.google.api.client.util.DataMap$Entry@830029082576}"message_id" -> "5724160613416960"
[3] = {com.google.api.client.util.DataMap$Entry@830029082600}"sent_at" -> "2014-11-13T10:57:03.950+01:00"
[1] = {com.appspot.com_pany.company.model.ChatsChatResponse@830029066376} size = 4
[0] = {com.google.api.client.util.DataMap$Entry@830029083616}"author" -> "daniel"
[1] = {com.google.api.client.util.DataMap$Entry@830029083640}"message" -> "test 2"
[2] = {com.google.api.client.util.DataMap$Entry@830029083664}"message_id" -> "5649050225344512"
[3] = {com.google.api.client.util.DataMap$Entry@830029083688}"sent_at" -> "2014-11-13T10:48:40.960+01:00"
[2] = {com.appspot.com_pany.company.model.ChatsChatResponse@830029068008} size = 4
[0] = {com.google.api.client.util.DataMap$Entry@830029084760}"author" -> "daniel"
[1] = {com.google.api.client.util.DataMap$Entry@830029084784}"message" -> "test 1"
[2] = {com.google.api.client.util.DataMap$Entry@830029084808}"message_id" -> "5178081291534336"
[3] = {com.google.api.client.util.DataMap$Entry@830029084832}"sent_at" -> "2014-11-13T10:57:39.830+01:00"
为什么“sent_at”字段有如此随机的差异?
编辑 我忘了说,我不是在谈论对应于 TimeZone 的 1 小时轮类,而是在谈论分钟的随机性。
最佳答案
我不确定解决方案,但解释似乎很清楚:变化根本不是随机的,而是由于在小数点后添加一切造成的以毫秒为单位。
以第三条为例:
2014-11-13T09:41:01.998830
显然,解析器将其读取为:
hours: 09
minutes: 41
seconds: 01
milliseconds: 998830
由于毫秒大于 1000,它最终被转换为 998s 830ms
,当计算完整分钟时为 16m 38s 830ms
。因此:
hours: 09
minutes: 41 + 16
seconds: 01 + 38
milliseconds: 830
这会产生您所看到的结果(模时区调整):
2014-11-13T10:57:39.830+01:00
如果您可以控制服务输出(这一点从问题的措辞中不是很清楚),最简单的解决方法是只输出小数点后三位数字(即四舍五入为毫秒而不是百万分之一)。例如,这将是 2014-11-13T09:41:01.999
。
也可以在解析器本身上修复此问题,但这需要更多的研究(理想情况下,需要一个重现问题的要点)。
关于android - 如何修复使用 Jackson/Gson 库解析的不准确的日期时间(分钟)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26909165/