チャットアプリケーションにfirebaseを使用しています。チャットオブジェクトでは、Firebase.ServerValue.TIMESTAMP
メソッドを使用してタイムスタンプを追加しています。
このタイムスタンプを使用して、チャットアプリケーションでメッセージの受信時間を表示する必要があります。
現在の時刻の場合、時刻のみを表示する必要があります。日付の差があるため、日付と時刻または日付のみを表示する必要があります。
Firebaseタイムスタンプを変換するために次のコードを使用しましたが、実際の時間を取得できません。
var timestamp = '1452488445471';
var myDate = new Date(timestamp*1000);
var formatedTime=myDate.toJSON();
この問題の解決策を提案してください
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;
});
実際、使用した場合にのみ機能します
firebase.database.ServerValue.TIMESTAMP
名前空間にさらに1つの「データベース」があります。
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);
});
データベース更新にタイムスタンプを添付する適切な方法は、リクエストにプレースホルダー値を添付することです。以下の例では、FirebaseはcreatedAt
プロパティをタイムスタンプに置き換えます:
firebaseRef = firebase.database().ref();
firebaseRef.set({
foo: "bar",
createdAt: firebase.database.ServerValue.TIMESTAMP
});
ドキュメント によると、値firebase.database.ServerValue.TIMESTAMP
は、次のとおりです。
firebase関数内では、タイムスタンプを次のように変換します。
timestampObj.toDate()
timestampObj.toMillis().toString()
ドキュメントはこちら https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp
それは単純だ。その関数を使用して、サーバーのタイムスタンプをミリ秒として一度だけ取得します:
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
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()
タイムスタンプはオブジェクトです
timestamp= {nanoseconds: 0,
seconds: 1562524200}
console.log(new Date(timestamp.seconds*1000))