web-dev-qa-db-ja.com

Firebase TIMESTAMPの日付と時刻

チャットアプリケーションにfirebaseを使用しています。チャットオブジェクトでは、Firebase.ServerValue.TIMESTAMPメソッドを使用してタイムスタンプを追加しています。

このタイムスタンプを使用して、チャットアプリケーションでメッセージの受信時間を表示する必要があります。

現在の時刻の場合、時刻のみを表示する必要があります。日付の差があるため、日付と時刻または日付のみを表示する必要があります。

Firebaseタイムスタンプを変換するために次のコードを使用しましたが、実際の時間を取得できません。

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

この問題の解決策を提案してください

39
Kichu

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;
  });
28
Bek

実際、使用した場合にのみ機能します

firebase.database.ServerValue.TIMESTAMP

名前空間にさらに1つの「データベース」があります。

19
Tiago Gouvêa

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);
});

ドキュメント

10
Kyle Finley

Firebaseの新しいバージョンのソリューション(2016年1月以降)

データベース更新にタイムスタンプを添付する適切な方法は、リクエストにプレースホルダー値を添付することです。以下の例では、FirebaseはcreatedAtプロパティをタイムスタンプに置き換えます:

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

ドキュメント によると、値firebase.database.ServerValue.TIMESTAMPは、次のとおりです。

6
Matt

firebase関数内では、タイムスタンプを次のように変換します。

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

ドキュメントはこちら https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp

3
Dan Alboteanu

それは単純だ。その関数を使用して、サーバーのタイムスタンプをミリ秒として一度だけ取得します

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.database.ServerValue.TIMESTAMPははるかに正確で、ほとんどの読み取り/書き込み操作に適していますが、Firebase Realtime Databaseのサーバーに対するクライアントのクロックスキューを推定すると役立つ場合があります。場所/.info/serverTimeOffsetにコールバックを添付して、Firebase Realtime Databaseクライアントがローカルの報告時間(ミリ秒単位のエポック時間)に追加してサーバー時間を推定する値をミリ秒単位で取得できます。このオフセットの精度は、ネットワーク遅延によって影響を受ける可能性があるため、主にクロック時間の大きな(1秒を超える)差異を発見するのに役立ちます。

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

3
beytarovski

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());

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

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

タイムスタンプはオブジェクトです

timestamp= {nanoseconds: 0,
seconds: 1562524200}

console.log(new Date(timestamp.seconds*1000))
1
vineet