Firebase TIMESTAMP到日期和时间

时间:2016-01-11 10:03:03

标签: javascript angularjs firebase

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

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

如果是当前时间我只需要显示时间。我需要显示日期和时间或仅显示日期。

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

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

请为此问题建议解决方案

20 个答案:

答案 0 :(得分:28)

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

答案 1 :(得分:19)

事实上,它只对我有用

firebase.database.ServerValue.TIMESTAMP

使用一个数据库'更多关于命名空间。

答案 2 :(得分:7)

对于那些寻找Firebase Firestore等效的人。这是

firebase.firestore.FieldValue.serverTimestamp()

e.g。

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

答案 3 :(得分:5)

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纪元以来的时间,以毫秒为单位) "

答案 4 :(得分:4)

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

  • 在一个 var 中获取 firebase 时间,例如:- const date

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

答案 5 :(得分:3)

很简单。使用该函数将服务器时间戳设置为毫秒仅一次

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实时数据库的服务器。你可以附加一个回调   location /.info/serverTimeOffset获取值,以毫秒为单位,   Firebase实时数据库客户端添加到本地报告的时间   (以毫秒为单位的纪元时间)来估计服务器时间。注意   这种偏移的准确性会受到网络延迟等因素的影响   主要用于发现大的(> 1秒)差异   在时钟时间。

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

答案 6 :(得分:2)

对于Firestore(这是Google的新一代数据库),以下代码将帮助您解决此问题。

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

答案 7 :(得分:2)

这是将值从Firebase Timestamp类型转换为JS日期的安全方法 如果该值不是时间戳,则该方法按原样返回

适用于Angular 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;
}

答案 8 :(得分:2)

Firebase内部函数可以像这样转换时间戳:

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

时间戳是一个对象

timestamp= {nanoseconds: 0,
seconds: 1562524200}

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

答案 11 :(得分:0)

遍历这是对我有用的精确代码。

querySnapshot.docs.forEach((e) => {
   var readableDate = e.data().date.toDate();
   console.log(readableDate);
}

答案 12 :(得分:0)

我转换为这种格式

let timestamp = '1452488445471';
let newDate = new Date(timestamp * 1000)
let Hours = newDate.getHours()
let Minutes = newDate.getMinutes()
const HourComplete = Hours + ':' + Minutes
let formatedTime = HourComplete
console.log(formatedTime)

答案 13 :(得分:0)

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

答案 14 :(得分:0)

尝试一下,

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

答案 15 :(得分:0)

    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)

答案 16 :(得分:-1)

此代码适用于我

<script src="https://www.gstatic.com/firebasejs/4.5.1/firebase.js"></script>
<script>
var config = {
    apiKey: "",
    authDomain: "",
    databaseURL: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: ""
};

firebase.initializeApp(config);
var reff = firebase.database().ref('message');
reff.on('value',haveData, haveerr);
function haveData(datahave){
    var existval= datahave.val();
    var chabi=Object.keys(existval);
    for(var d2=0;d2< chabi.length;d2++){
        var r=chabi[d2];
        var exitval=existval[r].Message;
        var exitval1=existval[r].Name;
        var exit=existval[r].Email;
        var exitval2=existval[r].Subject;
        var timestamp=existval[r].timestamp;
        var sdate=new Date(timestamp);
        var Year=sdate.getFullYear();
        var month=sdate.getMonth()+1;
        var day=sdate.getDate();
        var hh=sdate.getHours();
        var mm=sdate.getMinutes();
        var ss=sdate.getSeconds();
    }
}

function haveerr(e){
     console.log(e);
}
</script>

firebase database

答案 17 :(得分:-1)

这对我有用:

var timestamp   = snapshot.val().timestamp.toString().substring(0,10),
  date        = new Date(timestamp * 1000),
  datevalues  = [
                   date.getFullYear(),
                   date.getMonth()+1,
                   date.getDate(),
                   date.getHours(),
                   date.getMinutes(),
                   date.getSeconds(),
                ]; //=> [2011, 3, 25, 23, 0, 0]

日期示例: 8/11/2017 21:46

var formatDate =  datevalues[2]+"/"+datevalues[1]+"/"+datevalues[0]+ " "+datevalues[3]+":"+datevalues[4];

的console.log(formatDate);

此致

答案 18 :(得分:-1)

First Of All Firebase.ServerValue.TIMESTAMP对我不起作用了。

因此,要添加时间戳,您必须使用Firebase.database.ServerValue.TIMESTAMP

时间戳采用长毫秒格式。将毫秒转换为简单的日期格式。

显示/ MM / yy HH:mm:ss

您可以在java中使用以下代码:

从firebase数据库中获取字符串中的时间戳值

String x = dataSnapshot.getValue (String.class);

数据现在是字符串。您可以将string转换为long

long milliSeconds= Long.parseLong(x);

然后创建SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm:ss");

现在将您的毫秒时间戳转换为ur sdf格式

String dateAsString = sdf.format (milliSeconds);

之后,您可以将其解析为Date变量

 date = sdf.parse (dateAsString);

答案 19 :(得分:-7)

Firebase.ServerValue.TIMESTAMPnew Date().getTime()相同。

转换它:

var timestamp = '1452488445471';
var myDate = new Date(timestamp).getTime();