0
votes

Quel est le problème dans cette conversion d'horodatage Firestore en date dans mon application Angular?

Je travaille sur un projet Angular utilisant la base de données FireStore et j'ai le problème suivant:

Dans ma base de données Firestore a J'ai des documents comme celui-ci:

 entrez la description de l'image ici

Comme vous pouvez le voir sur la photo précédente, les champs start et end sont définis sur Firestore comme TimeStamp champs.

Dans une classe de service, je récupère tous ces documents de cette collection et je renvoie ces documents sous forme de liste de Observables par cette méthode:

START DATE:  Sun Feb 16 3986 07:00:00 GMT-0800 (Ora standard del Pacifico USA)

Puis dans la méthode ngOnInit () de ma classe de composant je fais:

var date = new Date(0); // The 0 there is the key, which sets the date to the epoch
date.setUTCSeconds(event.start);

et voici mon problème: la valeur de l ' event.start n'est pas une date mais un objet comme celui-ci (c'est la sortie console.log ()):

START:  t {seconds: 1487257200, nanoseconds: 0}

De quoi Je sais que cet objet représente ma date mais comment puis-je le convertir ag ain dans un objet Date .

Comme vous pouvez le voir, j'ai essayé de faire de cette manière:

ngOnInit() {

    this.eventService.getEvents().subscribe(events => { this.events = events.map((event) => {

    console.log("START: ", event.start);
    //var date = new Date(event.start);
    var date = new Date(0); // The 0 there is the key, which sets the date to the epoch
    date.setUTCSeconds(event.start);

    var hour = date.getHours();

    console.log("START DATE: ", date);
    console.log("START HOUR: ", hour);
    // ...
}

mais en faisant ceci façon dont j'obtiens une mauvaise date, en fait j'obtiens:

getEvents(): Observable<any[]> {
    this.items = this.db.collection('calendar').valueChanges();

    return this.items;
 }

le mois et le jour (16 février) sont corrects mais l'année est totalement erronée (3986 au lieu de 2017 ).

Qu'est-ce qui ne va pas? Qu'est-ce que je rate? Quelle est la bonne façon d'obtenir un objet Date à partir de l'horodatage Firestore récupéré?


4 commentaires

Est-ce que cela répond à votre question? Comment convertir une date Firestore / Horodatage d'une date JS ()?


@MauriceNino Cela fonctionne bien merci !!! J'en profite pour vous poser une question (considérez que je suis très nouveau dans JS \ TypeScript, je viens de Java). Si j'étais en Java en train de faire event.start. puis en appuyant sur la tabulation sur mon IDE j'aurais obtenu la liste de toutes les méthodes possibles que je peux appliquer sur l'objet "event.start" (inclus cette méthode toDate ()). Faire cela dans mon code TypeScript ne se produit pas. Je ne peux pas obtenir cette méthode toDate () comme méthode possible applicable sur mon objet "event.start". Pourquoi?


C'est parce que votre objet n'a pas encore de type. Je ne sais pas s'il y a une saisie pour les horodatages Firebase, mais vous pouvez l'écrire vous-même. Je voudrais vous donner une réponse plus détaillée, mais la section des commentaires ne me permet pas de le faire. Mais votre méthode renvoie un tableau any . Ce qui signifie que cela peut être n'importe quoi, vous ne pouvez donc pas taper pour TOUT. Vous auriez à le taper correctement. Comme renvoyer Timestamp [] à la place si cela existe.


Je vais mieux illustrer cela dans une réponse


3 Réponses :


2
votes

parce que l'horodatage de Firestore est en fait différent de la date JS normale ().

afin d'obtenir la date JS à partir de l'horodatage, vous pouvez utiliser la méthode que Firestore a sur ses horodatages.

dans votre code:

event.start doit être event.start.toDate ()

PS. pour que votre IDE connaisse les méthodes qui fonctionnent sur cet objet. Le typographie doit connaître le type d'objet dont il s'agit. Ainsi, par exemple, si vous utilisez AngularFire et que vous passez un appel pour obtenir un document, le type sera déjà là et votre IDE affichera les méthodes disponibles. Mais si le type d'objet est générique comme "any" alors votre IDE ne donnera pas les méthodes disponibles. et peut renvoyer une erreur comme "la méthode n'existe pas sur type any"


0 commentaires

1
votes

Vous ne construisez pas correctement la date JS. La bonne façon de créer une date est de lui passer des millisecondes.

var date = new Date(event.start.seconds * 1000);


0 commentaires

1
votes

Vous pouvez utiliser le Horodatage toDate () et mappez l'observable, y compris les tableaux, à Dates et renvoyez ces objets:

// Create a custom type to tidy it up. Would recommend creating that in another file. 
// Here more on type aliases: https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-aliases

type ReturnType = {start: Date, end: Date, title: string};

// Change the function to return the created type

getEvents(): Observable<ReturnType[]> {
    this.items = this.db.collection('calendar').valueChanges()
        .pipe(map(tArr => // Use pipe to transform an observable or subject to something else, without subscribing. Check out: https://rxjs-dev.firebaseapp.com/guide/operators
            tArr.map(t => { // Map the array of objects including Timestamps to dates
                t.start = t.start.toDate();
                t.end = t.end.toDate();
                return t;
            })
        )) as Observable<ReturnType[]>;

    return this.items;
}


0 commentaires