Firebase时间戳转日期和时间

89

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

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

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

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

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

请提出解决此问题的建议


5
不需要将时间戳乘以1000。 - Bek
那么我该如何转换? - Kichu
5
变量myDate用于创建一个新的日期对象,它将基于给定的时间戳(timestamp)。 - Bek
你想要输出的格式是什么? - Bek
我想分别显示时间和日期。 - Kichu
@Bek javascript的new Date()是从毫秒转换的,所以你需要*1000,因为Firebase返回类似于时间戳的东西:{"seconds": 1537022235,"nanoseconds": 353000000} https://www.w3schools.com/jsref/jsref_obj_date.asp - mshthn
23个回答

54

Timestamp 是一个对象:

timestamp = {
  nanoseconds: 0,
  seconds: 1562524200
}

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


我认为这就是用户所询问的。 - Chukwuemeka Maduekwe
完全可行并返回日期 - 日(字母)月(字母)日期(数字)年份(数字)时间(hh:mm)和时区(GMT+ ..)。谢谢。 - Suyash Vashishtha
1
为什么要把秒数乘以1000?谢谢。 - Rodius
2
new Date(milliseconds) 函数接受毫秒数,要将秒转换为毫秒,需要乘以1000。 - vineet

36

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

2
如果您执行 console.log(new Date(snapshot.val())),您将看到日期作为字符串。var date = new Date(snapshot.val()) 将会给您一个对象中的日期,您可以在其上调用有用的函数:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date - Frank van Puffelen

29

23

对于那些寻找 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);
});

文档


我正在尝试使用这个解决方案,但是我遇到了以下错误 - ReferenceError: firebase未定义。我正在使用js。 - Rahul Bagal
1
Rahul,听起来你没有安装或加载Firebase库。你是使用Web版本还是Node JS版本?https://firebase.google.com/docs/firestore/quickstart - Kyle Finley
1
我发现通过为“时间戳”值添加一个新的字段名“createdAt”,它会自动为所有文档创建一个时间戳。 - kai_onthereal

23

实际上,只有在我使用时才起作用。

firebase.database.ServerValue.TIMESTAMP

在命名空间上再增加一个“database”。


2
但它使用形式如1486106680368,我该如何将其转换为日期和时间。 - Ayaz Ahmad Tarar
如果您正在使用Angular,可以直接使用内置管道(例如“Date”),或者使用angular2-moment轻松转换时间戳。 - William Wu
@WilliamWu 但它会使用客户端时间戳,不是吗?Firebase ServerValue.TIMESTAMP 确保它是来自服务器的“真实”时间。 - Tiago Gouvêa

9

我知道Firebase返回的时间戳格式是 {seconds: '', and nanoseconds: ''}

  • 要将时间戳转换为日期,您只需:
  • 将 Firebase 时间戳存储在一个变量中,例如:const date

然后使用date.toDate()方法,即可返回日期。


9

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

8

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

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

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

根据文档firebase.database.ServerValue.TIMESTAMP代表“一个占位符值,由Firebase数据库服务器自动填充当前时间戳(自Unix纪元以来的毫秒数)”。

6

试试这个。

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

6
以下是一个安全的方法,可将来自Firebase Timestamp类型的值转换为JS Date类型。如果值不是Timestamp,则该方法将按原样返回它。
适用于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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接