Wie konvertiere ich ein Firestore-Datum / einen Zeitstempel in ein JS-Datum ()?

78

Ich versuche, das folgende Datum in ein Javascript Date () -Objekt zu konvertieren. Wenn ich es vom Server zurück bekomme, ist es ein Zeitstempelobjekt.

Screenshot von der Firebase Firestore-Konsole:

Geben Sie hier die Bildbeschreibung ein

Wenn ich Folgendes in einer Liste von Objekten versuche, die vom Firestore zurückgegeben wurden:

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

Ich bekomme diese Ausgabe: Geben Sie hier die Bildbeschreibung ein

Es ist klar, dass die Zeitstempel alle unterschiedlich sind und nicht alle das gleiche Datum vom 9. September 2018 haben (was zufällig heute ist). Ich bin mir auch nicht sicher, warum dies new Date(Timestamp)zu einem führt invalid date. Ich bin ein bisschen ein JS-Neuling. Mache ich etwas falsch mit den Daten oder Zeitstempeln?

blueether
quelle

Antworten:

146

Der Konstruktor für ein JavaScript-Datum weiß nichts über Firestore- Zeitstempelobjekte - er weiß nicht, was er damit tun soll.

Wenn Sie einen Zeitstempel in ein Datum konvertieren möchten, verwenden Sie die Methode toDate () für den Zeitstempel.

Doug Stevenson
quelle
Vielen Dank für die schnelle Antwort, das war genau das, was ich brauchte
Blueether
12
@blueether oder jemand anderes könnte ein funktionierendes Beispiel posten? Weil ich nur einen Fehler bekomme ...toDate() is not a function.
Nitneq
toDate () ist keine Funktion
Muhammad
17

Bitte verwenden Sie die toDate () -Methode und konvertieren Sie sie dann mit einem Winkelrohr wie diesem in das Format.

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

Naman Sharma
quelle
Lief wie am Schnürchen!
Hasintha Abeykoon
13

Sie können die Funktion toDate () zusammen mit toDateString () verwenden, um nur den Datumsteil anzuzeigen.

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

Angenommen, Sie möchten nur den Zeitteil und verwenden dann toLocaleTimeString ()

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

Sie können Timestamp.fromDateund .toDatezum Konvertieren hin und her verwenden.

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

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

So konvertieren Sie den Unix-Zeitstempel in ein JavaScript-Datumsobjekt.

var myDate = a.record.dateCreated;
new Date(myDate._seconds * 1000); // access the '_seconds' attribute within the timestamp object
Dilshan Liyanage
quelle
5
const timeStampDate = record.createdAt;
const dateInMillis  = timeStampDate._seconds * 1000

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

OutPut-Beispiel: Sat 11 Jul 2020 at 21:21:10

Stephan Ngaha
quelle
3

Endlich konnte ich bekommen, was ich brauchte. Dies gibt das Datum als zurück08/04/2020

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

Das funktioniert bei mir.

new Date(firebaseDate.toDate())
Uddesh_jain
quelle
1

Das funktioniert bei mir

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)
NC Armstrong
quelle
1

Dies könnte helfen:

new Date(firebaseDate._seconds * 1000).toUTCString()
Prottay
quelle
0

Ich hatte das gleiche Problem. Und ich habe es so herausgefunden:

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

Die Ausgabe sollte wie z 2020-08-04

Bastek
quelle
0

Das Zeitstempelobjekt, das Sie vom Firestore erhalten, verfügt über eine toDate()Methode, die Sie verwenden können.

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

Hier ist ein Zitat aus Firebase-Dokumenten über die toDate()Methode

Konvertieren Sie einen Zeitstempel in ein JavaScript-Datumsobjekt. Diese Konvertierung führt zu einem Genauigkeitsverlust, da Datumsobjekte nur eine Millisekundengenauigkeit unterstützen.

Rückgabe Datum JavaScript Datumsobjekt, das denselben Zeitpunkt wie dieser Zeitstempel mit Millisekundengenauigkeit darstellt.

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

Craig Tanaka
quelle
0

Wenn Sie die Millisekunden nicht verlieren möchten, können Sie Folgendes tun:

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