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?

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.


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'}}


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

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

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

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


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


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)

1

Dies könnte helfen:

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

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


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]


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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.