android - 如何修复使用 Jackson/Gson 库解析的不准确的日期时间(分钟)?

标签 android google-app-engine jackson gson

我正在开发一个与某些 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/

相关文章:

java - Java中的Json : How to extract list of subelements?

java - 如果所有嵌套字段都为空,Jackson 将忽略顶级字段的序列化

Android,为什么要使用 Button View ,因为每个 View 都可以有一个 onclicklistener

java - 用 RxJava 替换异步任务

android - LocalActivityManager 在尝试添加选项卡时显示警告和无法在 Activity-Application Stop 中使用 TabHost

android - 为什么在给定 List<List<Any>> 时,参数化 JUnit 测试会抛出 IllegalArgumentException,但适用于 List<Array<Any>>

python - 使用自定义验证器存储重复的 KeyProperty 时出现 BadValueError

google-app-engine - GAE Cron Job 会等待之前的 Cron Job 完成后再运行吗?

android - 在 Android 中上传到 App Engine Blob 存储

java - RESTEasy/Jackson 未将分层 POJO 正确序列化为 JSON