截至日期和时间的Firebase时间戳

6ss1mwsb  于 2022-09-18  发布在  Java
关注(0)|答案(22)|浏览(173)

我正在为我的聊天应用程序使用Firebase。在Chat对象中,我使用Firebase.ServerValue.TIMESTAMP方法添加时间戳。

我需要使用此时间戳在我的聊天应用程序中显示消息接收时间。

如果是当前时间,我只需要显示时间。如果有天差,我需要显示日期和时间,或者只显示日期。

我使用了以下代码来转换Firebase时间戳,但我没有获得实际时间。

var timestamp = '1452488445471';
var myDate = new Date(timestamp*1000);
var formatedTime=myDate.toJSON();

请为这个问题提出解决方案

ao218c7q

ao218c7q1#

Timestamp是一个对象:

timestamp = {
  nanoseconds: 0,
  seconds: 1562524200
}

console.log(new Date(timestamp.seconds*1000))
pkln4tw6

pkln4tw62#

Firebase.ServerValue.TIMESTAMP不是实际的时间戳,它是一个常量,如果您将其设置为某个变量,它将被服务器中的实际值替换。

mySessionRef.update({ startedAt: Firebase.ServerValue.TIMESTAMP });
mySessionRef.on('value', function(snapshot){ console.log(snapshot.val()) })
//{startedAt: 1452508763895}

如果您希望获得服务器时间,则可以使用以下代码

fb.ref("/.info/serverTimeOffset").on('value', function(offset) {
    var offsetVal = offset.val() || 0;
    var serverTime = Date.now() + offsetVal;
  });
chhkpiq4

chhkpiq43#

事实上,它只有在我使用的时候才起作用

firebase.database.ServerValue.TIMESTAMP

在命名空间上多了一个“数据库”。

nuypyhwy

nuypyhwy4#

对于那些正在寻找Firebase Firestore等价物的用户。它是

firebase.firestore.FieldValue.serverTimestamp()

例如:

firebase.firestore().collection("cities").add({
    createdAt: firebase.firestore.FieldValue.serverTimestamp(),
    name: "Tokyo",
    country: "Japan"
})
.then(function(docRef) {
    console.log("Document written with ID: ", docRef.id);
})
.catch(function(error) {
    console.error("Error adding document: ", error);
});

Docs

fjnneemd

fjnneemd5#

在Firebase内部,函数按如下方式转换时间戳:

timestampObj.toDate()
timestampObj.toMillis().toString()

此处的文档https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp

s4n0splo

s4n0splo6#

我知道Firebase在{seconds: '', and nanoseconds: ''}中给出了转换为日期的时间戳,您只需做:

  • 在一个变量中获取火基时间:-常量日期

然后date.toDate()=>它返回日期。

balp4ylt

balp4ylt7#

对于来自Google的新一代数据库FiRestore,下面的代码将简单地帮助您解决这个问题。

var admin    = require("firebase-admin");

var serviceAccount = require("../admin-sdk.json"); // auto-generated file from Google firebase.

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});
var db = admin.firestore();

console.log(admin.firestore.Timestamp.now().toDate());
gblwokeq

gblwokeq8#

Firebase新版本解决方案(2016年1月后)

将时间戳附加到数据库更新的正确方法是在请求中附加占位符值。在下面的示例中,Firebase将用时间戳替换createdAt属性:

firebaseRef = firebase.database().ref();
firebaseRef.set({
  foo: "bar", 
  createdAt: firebase.database.ServerValue.TIMESTAMP
});

根据documentation,值firebase.database.ServerValue.TIMESTAMP是:“由Firebase数据库服务器自动填充当前时间戳(自Unix时代以来的时间,以毫秒为单位)的占位符值。”

pw136qt2

pw136qt29#

下面是一个将值从Firebase Timestamp类型转换为JS Date的安全方法,如果该值不是Timestamp,则该方法会按原样返回该值

适用于7/8/9角

import firebase from 'firebase';
import Timestamp = firebase.firestore.Timestamp;

export function convertTimestampToDate(timestamp: Timestamp | any): Date | any {
  return timestamp instanceof Timestamp
    ? new Timestamp(timestamp.seconds, timestamp.nanoseconds).toDate()
    : timestamp;
}
wwodge7n

wwodge7n10#

使用Firebase Firestone 18.0.1(com.google.Firebase.Timestamp)

val timestamp = (document.data["timestamp"] as Timestamp).toDate()
c3frrgcw

c3frrgcw11#

这很简单。使用该函数获取服务器时间戳,单位为毫秒仅一次

var getServerTime = function( cb ) {
    this.db.ref( '.info/serverTimeOffset' ).once( 'value', function( snap ) {
      var offset = snap.val();

      // Get server time by milliseconds
      cb( new Date().getTime() + offset );
    });
};

现在你可以在任何地方使用它,就像这样:

getServerTime( function( now ) {
    console.log( now );
});

为什么使用这种方式?

根据最新的Firebase文档,您应该将Firebase时间戳转换为毫秒。因此您可以使用下面的estimatedServerTimeMs变量:

var offsetRef = firebase.database().ref(".info/serverTimeOffset");
offsetRef.on("value", function(snap) {
  var offset = snap.val();
  var estimatedServerTimeMs = new Date().getTime() + offset;
});

虽然Firebase.datase.ServerValue.TIMESTAMP要准确得多,而且对于大多数读/写操作来说也更可取,但有时估计客户端相对于Firebase实时数据库服务器的时钟偏差可能很有用。您可以将回调附加到位置/.info/serverTimeOffset,以获取Firebase实时数据库客户端添加到本地报告时间(以毫秒为单位的纪元时间)以估计服务器时间的值(以毫秒为单位)。请注意,此偏移量的准确性可能会受到网络延迟的影响,因此主要用于发现时钟时间中的较大(>1秒)差异。

https://firebase.google.com/docs/database/web/offline-capabilities

e0bqpujr

e0bqpujr12#

试试这个,

var timestamp = firebase.firestore.FieldValue.serverTimestamp()
var timestamp2 = new Date(timestamp.toDate()).toUTCString()
xwbd5t1u

xwbd5t1u13#

new Date(timestamp.toDate()).toUTCString()

6yt4nkrj

6yt4nkrj14#

import firebaseAPP from 'firebase/app';

    public Date2firestoreTime(fromDate: Date) {
       return firebaseAPP.firestore.Timestamp.fromDate(fromDate).toMillis()
    }
    public firestoreTime2Date(millisecDate: number) {
       return firebaseAPP.firestore.Timestamp.fromMillis(millisecDate).toDate()
    }

    //usage:
    let FSdatenow = this.Date2firestoreTime(new Date())
    console.log('now to firestore TimeStamp', FSdatenow)
    let JSdatenow = this.firestoreTime2Date(FSdatenow)
    console.log('firestore TimeStamp to Date Obj', JSdatenow)
dddzy1tm

dddzy1tm15#

var date = new Date((1578316263249));//data[k].timestamp
console.log(date);

相关问题