android – 如何修复使用Jackson / Gson库解析的不准确的DateTime(分钟)?

前端之家收集整理的这篇文章主要介绍了android – 如何修复使用Jackson / Gson库解析的不准确的DateTime(分钟)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在开发一个与一些Google App Engine网络服务对话的Android应用程序.

此应用程序实现了一个聊天活动,它具有非常简单的功能:发送文本.

在调试过程中,我注意到我从服务器列出的消息没有按照我在应用程序上发送的顺序显示.我的第一个想法是问题来自服务器.

起初我检查了我收到的原始Json:

{
 "messages": [
  {
   "message": "test 3","author": "daniel","message_id": "5724160613416960","sent_at": "2014-11-13T09:42:42.861950"
  },{
   "message": "test 2","message_id": "5649050225344512","sent_at": "2014-11-13T09:42:10.390960"
  },{
   "message": "test 1","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项目:

[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.

也许有可能在解析器本身上修复它,但它需要更多的研究(理想情况下,一个重现问题的要点).

原文链接:https://www.f2er.com/android/431169.html

猜你在找的Android相关文章