我如何转换一个火灾恢复日期/时间戳到一个 JS 日期() ?

我试图将下面的日期转换成一个 javascript Date ()对象。当我从服务器返回时,它是一个 Timestamp 对象,

来自 Firebase Firest 控制台的截图:

enter image description here

当我在一个对象列表中尝试以下操作时,返回的对象是:

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

我得到这个输出: enter image description here

显然,时间戳都是不同的,并不都是2018年9月9日(恰好是今天)的同一天。我也不知道为什么 new Date(Timestamp)会导致 invalid date。我是个 JS 新手,我是不是把日期或者时间戳弄错了?

151987 次浏览

JavaScript 的 Date的构造函数不知道任何有关 Firest 的 Timestamp对象的信息ーー它不知道如何处理这些对象。

如果要将 Timestamp转换为 Date,请使用 Timestamp上的 toDate()方法。

请使用 toDate()方法,然后转换成格式使用角管像这样-

   \{\{ row.orderDate.toDate() | date: 'dd MMM hh:mm' }}

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

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

最后,我可以得到我需要的。这个返回日期为 08/04/2020

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

您可以使用 Timestamp.fromDate.toDate来进行来回转换。

// Date to Timestamp
const t = firebase.firestore.Timestamp.fromDate(new Date());


// Timestamp to Date
const d = t.toDate();

可以使用 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

这对我有用。

new Date(firebaseDate.toDate())
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

我也有同样的问题,然后我发现:

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

从 firestore 获得的时间戳对象有一个可以使用的 toDate()方法。

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

这里引用了 firebase 文档中关于 toDate()方法的一段话

将时间戳转换为 JavaScriptDate 对象 由于 Date 对象只支持毫秒,因此会导致精度损失 精确。

中表示相同点的 Date JavaScript Date 对象 时间就像这个时间戳一样,精确到毫秒。

Https://firebase.google.com/docs/reference/js/firebase.firestore 时间戳 # 至今

如果你不想失去毫秒,你可以做以下事情:

var myDate = a.record.dateCreated;
new Date((myDate.seconds + myDate.nanoseconds * 10 ** -9) * 1000);

这对我有用

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)

这可能会有所帮助:

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

除了其他的答案,你也可以这样做

    //date from firebase is represented as
let time = {
seconds: 1613748319,
nanoseconds: 47688698687,
}
    

const fireBaseTime = new Date(
time.seconds * 1000 + time.nanoseconds / 1000000,
);
const date = fireBaseTime.toDateString();
const atTime = fireBaseTime.toLocaleTimeString();




console.log(date, atTime);

我的工作有棱角。

我有一个界面和一个现场日期: 日期。

有角的管道日期无法工作: order.date | 日期: ‘ media’

改变接口中字段日期的类型

date: firebase.firestore.Timestamp

角管道日期工作,但与函数的日期()

order.date.toDate() | date:'medium'

这真的很简单。使用这个简单的时间转换函数,它可以将时间秒转换成 Javascript 的日期和时间。

  function getUNIXTime(dt) {
let unix = new Date(dt * 1000);
return unix.toUTCString().slice(5, 16);
}

timestamp.seconds传递到这个函数中,然后根据需要对其进行切片,以获得包含日期和时间的文本字符串。

可以使用 白天库将 firebase 火灾恢复时间戳秒转换为本地时间。

newDate =  dayjs.unix(date.seconds).$d;

会的

date: {
seconds: 1639506600,
nanoseconds: 0
}

然后转换成

Date Sat Nov 16 2019 00:00:00 GMT+0530 (India Standard Time)

通常使用任何类型(即 loginDate: any)和 toDate ()在我的所有项目中都没有问题。但在我的上一个项目中,它没有。我在 Timestamp 看到的对象是 几秒钟(Firebase8.6.8)。这种类型的变化可能会影响它。我不知道,但我没有时间,所以我用了另一种解决办法。定制的烟斗。它可以作为另一种选择:

import { Pipe, PipeTransform } from '@angular/core';
import { formatDate } from '@angular/common';


@Pipe({
name: 'timestamp'
})
export class TimestampPipe implements PipeTransform {


transform(value: any, format?: string) {


if (!value) { return ''; }
if (!format) { format = 'dd MMM  yy'; }


return formatDate(value._seconds * 1000, format, 'tr');
}
}

还有

\{\{ item.endDate | timestamp}}

对于这个管道,类型并不重要。对于 loginDate: any 或 loginDate: Date well 可以使用。

将时间戳存储到 firestore 中:

import * as firebaseAdmin from "firebase-admin";


const created = firebaseAdmin.firestore.FieldValue.serverTimestamp();


// type
created: FirebaseFirestore.Timestamp | FirebaseFirestore.FieldValue | undefined;

作为 js Date对象读回

const createDate = (created as FirebaseFirestore.Timestamp).toDate();

RFC3339字符串的形式读回

const createDate = (created as FirebaseFirestore.Timestamp).toDate().toISOString();

网站火灾恢复时间戳:

function dateToFirestoreTimestamp(dateString = ''){
var timestampDate = new Date();     // this will return current date-time
if(dateString != ''){
// this will return timestamp according to provided date-time
dateString = dateString.replace(' ', 'T');
timestampDate = new Date(dateString);
}
timestampDate = firebase.firestore.Timestamp.fromDate(timestampDate);
return timestampDate;
}

将还原时间戳转换为纪元时间戳的一个简单方法是在还原时间戳上使用 toMillis()方法。
例如: 你有一个火还原时间戳
created_on : Timestamp { _seconds: 1622885490, _nanoseconds: 374000000 } < br >

let epochTimestamp = created_on.toMillis()
//epochTimestamp = 1621081015081
//Now this timestamp can be used as usual javascript timestamp which is easy to manipulate.
let date = new Date(epochTimestamp) //date = Sat May 15 2021 17:46:55 GMT+0530 (India Standard Time)

这是迄今为止最优雅、最精确、最简单的方法,可以将一个 firebase-time 戳转换为一个日期(不需要依赖等)

const date = new Intl.DateTimeFormat(
'de-De', {
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric'
}
).format(firebaseTimeStamp.toDate())

下面是一个包含所有必要参数的 备忘录

这是 火灾恢复时间戳Javascript Date ()对象之间的 与众不同。如果你想使用 javascript Date ()对象,从火灾恢复时间戳,这是我所做的:

const foo = new Date(firestoreTimestamp.toDate());

然后你可以像往常一样使用 javascript Date ()对象:

Https://www.w3schools.com/jsref/jsref_obj_date.asp

例如,我们希望用字符串格式从 Date ()对象检索日期:

const foo = new Date(firestoreTimestamp.toDate());
foo.toLocaleDateString();

等等。

这里有很多答案,但作为一个新手,我发现大多数都令人困惑。

因此,对于像我这样的菜鸟来说,这里有一个简单的解释,说明如何将 Firestordate/Timestamp 转换成所需的 Javascript Date ()和 为什么

为什么要改变信仰?

火还原将日期存储为 时间戳对象.这与 Javascript Date ()对象不同。

这让我很困惑,因为如果你发送一个 Date ()对象到 Firestore,然后检索它,它会返回一个时间戳对象。比如说,如果你递给 Firestor1美元,它会返还给你4个25美分硬币。这是相同数额的钱(或同一日期) ,但如果你期待的文件,并得到金属,你会感到困惑。

如何转换

幸运的是,Timestamp 对象内置了一些函数,因此可以得到一个 Javascript Date 对象: toDate

注意: 请记住,toDate看起来像 Javascript toLocaleDateString()toDateString(),但它不是。JS Date ()对象和 FirestorTimestamp 对象是不一样的,所以不要犯我的新手错误,试图从一个函数中使用另一个函数。

要将一个火恢复时间戳转换为 Javascript 日期,只需在 Timestamp 上调用 .toDate()

//get the document from Firestore
let fireStoreTimestamp = doc.data().nameOfYourDateField;
let javascriptDate = fireStoreTimestamp.toDate();

为了帮助那些仍然在寻找答案的人,将 FirestorDate 转换为 JSDate 以显示在 Web 应用程序中。这里有一个使用打字稿的例子..。

import {
Timestamp,
} from "firebase/firestore";


interface IStuff {
createdAt: Timestamp;
}


const insertStuff = async (text: string) => {
await addDoc(collection(db, "coolstuff"), {
text,
createdAt: serverTimestamp(),
});
};


<p>{item.createdAt?.toDate().toDateString()}</p>


// OR


<p>{item.createdAt?.toDate().toLocaleTimeString()}</p>


扩展 Waleed Tariq 的答案,得到一个更易读的字符串:

function formatDate(date) {
const formatDate = new Date(
date.seconds * 1000 + date.nanoseconds / 1000000
);
return formatDate.toLocaleTimeString('en-us', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
}


const timeStamp = {nanoseconds: 184000000, seconds: 1664826910};


console.log(formatDate(timeStamp))