Как преобразовать временную метку в firebase с использованием угловой даты - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь отобразить некоторую временную метку в базе шаблонов, к сожалению, не повезло с угловой датой.

<p>Seen {{user.updatedAt | date: 'yyyy/MM/dd h:mm:ss a'}}</p>

Я получаю эту ошибку:

     ERROR Error: InvalidPipeArgument: 
'Unable to convert "Timestamp(seconds=1528515928, nanoseconds=105000000)" 
into a date' for pipe 'DatePipe

Ответы [ 8 ]

0 голосов
/ 29 июля 2019

Вы можете захватить все свойства Timestamp в вашем сервисе и конвертировать все в дату.

Например:

import { firestore } from 'firebase/app';
import Timestamp = firestore.Timestamp;

@Injectable()
export class YourService {

....

    list = (): Observable<any[]> => this.collection
        .snapshotChanges()
        .pipe(
            map(changes => {
                return changes.map(a => {
                    const data = a.payload.doc.data() as any;
                    Object.keys(data).filter(key => data[key] instanceof Timestamp)
                        .forEach(key => data[key] = data[key].toDate())
                    data._id = a.payload.doc.id;
                    return data;
                });
            })
        );

...
}
0 голосов
/ 08 августа 2018

Дата конвейера займет несколько миллисекунд с начала UTC.https://angular.io/api/common/DatePipe. Временная метка Firebase обеспечивает секунды и доли секунд во времени UTC Epoch.Я использую ...

new Date(0).setUTCSeconds(YOURFIREBASEDOC.updatedAt['seconds'])
0 голосов
/ 24 октября 2018

Вы можете преобразовать метку времени в миллисекунды или в дату:

<p>Seen {{user.updatedAt.toMillis() | date:'yyyy/MM/dd h:mm:ss a'}}</p>

или

<p>Seen {{user.updatedAt.toDate() | date:'yyyy/MM/dd h:mm:ss a'}}</p>
0 голосов
/ 21 июля 2018

Я использую простой пользовательский канал в Angular 7. Он учитывает LOCALE_ID, и вы также можете использовать все форматы DatePipe:

import {formatDate} from '@angular/common';
import {Inject, LOCALE_ID, Pipe, PipeTransform} from '@angular/core';
import {firestore} from 'firebase/app';
import Timestamp = firestore.Timestamp;

@Pipe({
    name: 'firestoreDate'
})
export class FirestoreDatePipe implements PipeTransform {

    constructor(@Inject(LOCALE_ID) private locale: string) {
    }

    transform(timestamp: Timestamp, format?: string): string {
        return formatDate(timestamp.toDate(), format || 'medium', this.locale);
    }
}
0 голосов
/ 06 июля 2018

Возьмите обновленныйАт: любая в вас Модель.

import { DatePipe } from '@angular/common';

export class class1 implements OnInit {

    constructor(private datePipe: DatePipe) { }

    youMethod() {
        let aNewDate = this.datePipe.transform(user.updatedAt.toDate(),"medium");
        console.log(aNewDate)
        // This will print in format  Jun 5, 2018, 5:45:31 PM
   }

}

Вы можете использовать любой формат даты на месте («средний») для отображения вашей переменной даты.

0 голосов
/ 26 июня 2018

Попробуйте это {{ user.updatedAt.seconds * 1000 | date:'MM-dd-yyyy' }}, у отметки времени есть свойство секунд, поэтому вам нужно получить к нему доступ, а затем выполнить умножение и конвейер.Надеюсь, что это работает для вашего случая.

0 голосов
/ 15 июня 2018

Вместо yourDate: Date используйте yourDate: Timestamp из '@firebase/firestore-types';

читать

0 голосов
/ 09 июня 2018

Отображаемое время является меткой времени, а не фактической датой.вам нужно умножить время на 1000.

<p>Seen {{user.updatedAt * 1000 | date:'MM-dd-yyyy'}}</p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...