【问题标题】:How do I cast FieldValue.serverTimestamp() to Kotlin/Java Date Class如何将 FieldValue.serverTimestamp() 转换为 Kotlin/Java 日期类
【发布时间】:2023-03-03 08:26:21
【问题描述】:

我想保存在 Firestore 中创建帖子的日期,但我不想使用系统时间。为了准确起见,我想使用服务器时间戳。所以我使用FieldValue.serverTimestamp() 来获取服务器时间戳,但保存它的变量的数据类型是日期。那么如何将FieldValue.serverTimestamp() 转换为Date

下面是我的数据类的样子

data class MyModel( var timeStamp: Date,
    constructor(): this(Calendar.getInstance().time, "")
}

PS:当我在数据类中将时间戳声明为 FieldValue 时,出现以下错误:

java.lang.RuntimeException:在类上找不到要序列化的属性 com.google.firebase.firestore.FieldValue

【问题讨论】:

    标签: java android firebase kotlin google-cloud-firestore


    【解决方案1】:

    您收到以下错误:

    java.lang.RuntimeException:在类 com.google.firebase.firestore.FieldValue 上找不到要序列化的属性

    因为FieldValue 不是supported data type。您应该使用Date 类或任何其他扩展Date 类的类,例如Timestamp 类。

    如何将 FieldValue.serverTimestamp() 转换为 Kotlin/Java 日期类

    没有必要做任何演员。在 Java 中,甚至 没有 需要初始化 timeStamp 字段。要使其正常工作,您应该只使用注释,正如我在以下帖子中的回答中所解释的那样:

    编辑:

    在 Kotlin 中,您应该在构造函数中使用 null 值初始化 timeStamp 字段,如下所示:

    data class MyModel(
                   @ServerTimestamp
                   val timeStamp: Date? = null)
    

    【讨论】:

    • 感谢您的回答亚历克斯。我有 2 个后续问题 1. 你说我不必初始化 Date。如果是这样,那么我的承包商将如何看待。 Kotlin 中的示例代码,好吗? 2. 当您想在 Firestore 中保存帖子时,获取当前时间的最佳方式是什么?为了避免使用可能错误的客户端时间,我使用了 FieldValue.serverTimestamp()。你有更好的方法吗?
    • 嗨卡利斯图斯!对于第一个问题,请参阅我的更新答案。关于第二个,不,没有更好的方法。
    【解决方案2】:

    您可以使用一个对象来保存此值,然后在使用此值时检查对象的类型并使用它。据我所知,返回的数据类型是 Long,如果需要,您必须手动将其转换为 Data。

    此代码将如下所示,

    替换这个

    data class MyModel( var timeStamp: Date,
    

    data class MyModel( var timeStamp: Object,
    

    当在任何地方使用这个timeStamp 时,检查它的类型。 在java中它看起来像

    if (timeStamp instanceof Long) {
        // change Long to Date
        //do this
    }else{
        //do something else
    }
    

    timeStamp 的值设置为FieldValue.serverTimestamp() 本身。

    【讨论】:

      【解决方案3】:

      模型类

      data class MyModel(
              @get: PropertyName("timestamp") @set: PropertyName("timestamp") var timestamp: Date= Date()
          )
      

      初始化时;

      val model = MyModel().apply{
         this.timestamp to FieldValue.serverTimestamp()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 2012-08-12
        • 1970-01-01
        • 2019-03-12
        • 2019-09-13
        • 1970-01-01
        • 2021-06-07
        相关资源
        最近更新 更多