【问题标题】:Firestore Timestamp is (seconds: 0, nanoseconds: 0) when using Retrofit使用 Retrofit 时,Firestore 时间戳为(秒:0,纳秒:0)
【发布时间】:2019-12-04 06:35:54
【问题描述】:

我遇到了与在 Android 应用中解析 Firestore 时间戳相关的问题。

总结

在我的 Firebase Firestore 中,我有一组 cmets。每条评论都是这样的

(时间是时间戳类型)

我已经使用 Cloud Functions 构建了 REST API。 cmets 端点有一个 GET 方法。共享整个代码没有意义,重要的事实是,来自该端点的响应看起来像这样

如您所见,响应看起来不错,一切正常。

问题

现在,我有一个使用 Retrofit 与 API 通信的 Android 应用。它向上述端点发出请求并获得响应(响应为<List<CommentResponse>>)。

import com.google.firebase.Timestamp

data class CommentResponse(
    val placeId: String,
    val userUid: String,
    val userDisplayName: String,
    val userPhotoUrl: String,
    val time: Timestamp,
    val text: String
)

但是当我做Log.d(response.body)时,我得到(我删掉了不重要的数据)

[CommentResponse(placeId=opactwo, userUid=e09E...82, userDisplayName=Bartek Pacia, userPhotoUrl=https: .../photo.jpg, time=Timestamp(seconds=0, nanoseconds=0), text=This place is very beautiful :D)]

时间戳消失了。它不为空,但它指向时代的开始(1.1.1970)。这只是 0 秒,0 纳秒。我不使用任何自定义转换器或其他任何东西,只是“初级改造”。

嗯,就是这样。 我不知道为什么时间戳变为 0,0。

如果有人可以帮助我,我将不胜感激。 提前谢谢你。

【问题讨论】:

  • time 是 JsonObject,其中包含 secondsnanoseconds

标签: android firebase google-cloud-firestore google-cloud-functions retrofit


【解决方案1】:

您假设 Retrofit 知道如何根据来自服务器的默认 JSON 序列化反序列化时间戳。它不知道该怎么做。你将不得不自己管理。

当您的函数序列化时间戳时,它使用文档内容的默认序列化。它正在查看Timestamp 对象并说“嘿,有一个对象,所以为了序列化它,我只需将其所有属性复制到输出中”。如果您查看source for Timestamp,您会发现它使用属性_seconds 和_nanoseconds 来保存时间戳的组件。所以,这就解释了您看到的 JSON 输出。

在 Java(或 Kotlin)客户端,所有这些实际上都只是一个 Map 对象,类型信息已经消失(而且它不会有帮助,因为 JavaScript 的东西不会简单地映射到 Java 的东西)。没有人知道这是一个 Timestamp 类型的对象。它所知道的只是存在一个具有 _seconds 和 _nanoseconds 的对象。

您需要做的是在您的代码中加入一些智能(可能以自定义转换器的形式作为 Retrofit 的提示),以帮助它识别 time JSON 对象中的内容,并将其转换为 Timestamp 对象在本地使用java Timestamp constructor

或者,如果您不介意损失几纳秒的精度,只需让函数将时间戳转换为以毫秒为单位的时间,通过网络发送,然后让客户端简单地将其转换为 java Date 对象.

您可能还想停止依赖 JavaScript Timestamp 对象的内部细节。 因为 _seconds 和 _nanoseconds 实际上是私有细节,所以您依赖于将来可能会改变的东西。 请考虑使用其公共方法 getSeconds() 和 getNanoseconds() 中的数据显式序列化函数中的时间戳。

【讨论】:

  • 感谢您如此详尽的回复。纳秒对我来说并不重要。我将在 API 响应中返回毫秒并在客户端将其解析为 Date :)
猜你喜欢
  • 2022-06-13
  • 2014-03-20
  • 1970-01-01
  • 2017-02-15
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2023-03-17
相关资源
最近更新 更多