Firestore onSnapshot返回错误的时间戳格式

时间:2018-12-25 21:44:03

标签: firebase google-cloud-firestore

当我使用.get()获取FireStore文档时,我的时间字段将返回此值:createdAt: "2018-12-25T01:04:05.189Z",但是当我使用onSnapshot时,时间字段将返回不同的值:

1)使用onSnapshot

  componentDidMount() {
    this.unsubscribe = this.ref.doc('HCNFO3ZKlFNKK71JMzo8').onSnapshot(this.onCollectionUpdate)
  }

  componentWillUnmount() {
    this.unsubscribe();
  }

  onCollectionUpdate = (querySnapshot) => {
    this.setState({
      theLocation: querySnapshot.data()
    })
  }

返回:mylocations: { createdAt: Timestamp {seconds: 1545723905, nanoseconds: 177000000} }

2)在云上使用.get()

.then(() => {
  return firebaseAdminSDK.firestore().collection('locations').doc('HCNFO3ZKlFNKK71JMzo8').get()
})

返回:mylocations: { createdAt: "2018-12-25T07:45:05.177Z" }

保存位置时,我在云功能上使用了data.createdAt = FieldValue.serverTimestamp();

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

javascript客户端库中新的<script type="text/javascript"> document.getElementById("1").onclick = function () { location.href = "www.google.com"; }; </script> 对象(秒和纳秒)将成为默认时间戳,它将替换Firebase时间戳中的旧javascript Timestamp对象。您应该采用新的行为并更新代码以使用新的timestamp对象。

要使用时间戳记获取Date对象,请使用Date方法:

toDate()

您可以将新的时间戳记行为设为应用程序和云功能中的默认行为,并更新代码,以便在删除Date对象时,应用程序不会中断。要使用新的时间戳,您可以将const timestamp = snapshot.get('createdAt'); const date = timestamp.toDate(); 添加到Firestore设置中:

timestampsInSnapshots: true

答案 1 :(得分:0)

最终在云功能上使用moment.utc()

const createdAt = FieldValue.serverTimestamp()替换为const createdAt = moment.utc().valueOf()

在那之后,createdAt字段在云功能和前端获取上返回相同的值,因为它在Firestore中将时间戳存储为number而不是timestamp