如何将Firestore日期/时间戳转换为JS Date()?


78

我正在尝试将以下日期转换为javascript Date()对象。当我从服务器取回它时,它是一个Timestamp对象,

Firebase Firestore控制台的屏幕截图:

在此处输入图片说明

当我在从Firestore返回的对象列表上尝试以下操作时:

  list.forEach(a => {
    var d = a.record.dateCreated;
    console.log(d, new Date(d), Date(d))
  })

我得到以下输出: 在此处输入图片说明

显然时间戳是不同的,并且并非都在2018年9月9日(恰好是今天)的同一日期。我也不确定为什么会new Date(Timestamp)导致invalid date。我是JS新手,我对日期或时间戳记做错了吗?

Answers:


146

JavaScript Date的构造函数对Firestore Timestamp对象一无所知-它不知道如何处理它们。

如果要将时间戳转换为日期,请使用时间戳上的toDate()方法。


感谢您的快速回答,这正是我所需要的
blueether

12
@blueether或其他人可以发布工作示例吗?因为我只得到一个错误...toDate() is not a function
Nitneq

toDate()不是函数
穆罕默德


13

您可以将toDate()函数与toDateString()一起使用,以单独显示日期部分。

const date = dateCreated.toDate().toDateString()
//Example: Friday Nov 27 2017

假设您只需要时间部分,然后使用toLocaleTimeString()

const time = dateCreated.toDate().toLocaleTimeString('en-US')
//Example: 01:10:18 AM, the locale part 'en-US' is optional


9

如何将Unix时间戳转换为JavaScript Date对象。

var myDate = a.record.dateCreated;
new Date(myDate._seconds * 1000); // access the '_seconds' attribute within the timestamp object

5
const timeStampDate = record.createdAt;
const dateInMillis  = timeStampDate._seconds * 1000

var date = new Date(dateInMillis).toDateString() + ' at ' + new Date(dateInMillis).toLocaleTimeString()

输出示例: Sat 11 Jul 2020 at 21:21:10


3

最后,我可以得到所需的东西。返回日期为08/04/2020

new Date(firebase.firestore.Timestamp.now().seconds*1000).toLocaleDateString()


1

这对我有用

let val = firebase.timestamp // as received from the database, the timestamp always comes in an object similar to this - {_nanoseconds: 488484, _seconds: 1635367}
    (new Date( (val.time._seconds + val.time._nanoseconds * 10 ** -9) * 1000)).toString().substring(17, 21)

1

这可能会有所帮助:

new Date(firebaseDate._seconds * 1000).toUTCString()

0

我有同样的问题。而且我想像这样:

const createdAt = firebase.firestore.Timestamp.fromDate(new Date());

// then using dayjs library you can display your date as you want.

const formatDate = dayjs.unix(createdAt.seconds).format('YYYY-MM-DD');

输出应该像例如 2020-08-04


0

从Firestore获取的时间戳记对象具有toDate()可以使用的方法。

list.forEach(a => {
    var d = a.record.dateCreated;
    console.log(d.toDate())
  })

这是Firebase文档中有关该toDate()方法的报价

将时间戳转换为JavaScript Date对象。由于Date对象仅支持毫秒精度,因此这种转换会导致精度损失。

返回Date JavaScript Date对象,该对象表示与此Timestamp相同的时间点,精度为毫秒。

[https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp#todate]


0

如果您不想丢失毫秒,可以执行以下操作:

var myDate = a.record.dateCreated;
new Date((myDate.seconds + myDate.nanoseconds * 10 ** -9) * 1000);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.