Я пытаюсь преобразовать указанную ниже дату в объект Date () javascript. Когда я получаю его с сервера, это объект Timestamp,

Скриншот из консоли Firebase Firestore:

enter image description here

Когда я пробую следующее в списке объектов, возвращаемых из firestore:

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

Я получаю такой результат: enter image description here

Очевидно, что все временные метки разные, и не все совпадают с датой 9 сентября 2018 года (а это случилось сегодня). Я также не уверен, почему новая дата (отметка времени) приводит к недопустимой дате. Я немного новичок в JS, я что-то не так делаю с датами или отметками времени?

Ответы (22)

Конструктор для JavaScript Date ничего не знает об объектах Firestore Timestamp - он не знает, что с ними делать.

Если вы хотите преобразовать метку времени в дату, используйте метод toDate () для метки времени.

Наконец-то я получил то, что мне нужно. Это возвращает дату как 04.08.2020

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

Как преобразовать временную метку Unix в объект JavaScript Date.

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

Если вы не хотите терять миллисекунды, вы можете сделать следующее:

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

Это может помочь:

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

Вы можете использовать библиотеку dayjs для преобразования секунд метки времени firebase firestore в ваше местное время.

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

Потребуется

date: { 
    seconds: 1639506600, 
    nanoseconds: 0 
}

и преобразовать в

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

Объект отметки времени, который вы получаете из firestore, имеет toDate () метод, который вы можете использовать.

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

Вот цитата из документации firebase о методе toDate ()

Преобразование метки времени в объект даты JavaScript. Это преобразование вызывает потерю точности, поскольку объекты Date поддерживают только миллисекунды точность.

Возвращает Date Объект JavaScript Date, представляющий ту же точку в time как эта отметка времени с точностью до миллисекунды.

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

работаю в angular.

у меня есть интерфейс и дата поля: Date.

дата угловой трубы нет работы: order.date | дата: 'средний'

я меняю тип поля date в интерфейсе

date: firebase.firestore.Timestamp

дата работы угловой трубы, но с функцией toDate ()

order.date.toDate () | дата: 'средний'

Временная метка Web Firestore:

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

Обычно использование любого типа (например, loginDate: any) и toDate () работали без проблем во всех моих проектах. Но в моем последнем проекте этого не было. Я видел секунд в объекте Timestamp больше _seconds (Firebase 8.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 хорошо.

const timeStampDate = record.createdAt;
const dateInMillis = timeStampDate._seconds * 1000

var date = новая дата (dateInMillis) .toDateString () + 'at' + новая дата (dateInMillis) .toLocaleTimeString ()

Пример OutPut: Сб, 11 июл 2020 в 21: 21: 10

У меня работает.

new Date(firebaseDate.toDate())

Простой способ - преобразовать временную метку firestore в временную метку эпохи, используя метод toMillis () на временной метке firestore.
Например: У вас есть метка времени firestore
created_on: отметка времени {_seconds: 1622885490, _nanoseconds: 374000000}

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)

Пожалуйста, используйте метод toDate (), а затем преобразуйте его в формат, используя угловой конвейер, как это -

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

У меня работает

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)

Это, безусловно, самый элегантный, точный и простой способ преобразовать временную метку firebase в дату (никакой зависимости и т. Д.)

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

Вот шпаргалка со всеми необходимыми параметрами

Это действительно очень просто. Используйте эту простую функцию конвертера эпох, которая преобразует секунды эпох в дату и время Javascript.

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

Передайте timestamp.seconds в эту функцию, а затем нарежьте его в соответствии с вашими потребностями, чтобы получить строку текста с датой и временем.

Вы можете использовать функцию 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

Вы можете использовать Timestamp.fromDate и .toDate для преобразования туда и обратно.

// Дата до отметки времени
const t = firebase.firestore.Timestamp.fromDate (новая дата ());

// Отметка времени до даты
const d = t.toDate ();

для сохранения отметки времени в firestore:

import * as firebaseAdmin from "firebase-admin";

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

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

Чтобы прочитать обратно как js Дата объект

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

Чтобы прочитать как RFC3339 строка

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

У меня была такая же проблема. И я понял вот так:

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

Результат должен выглядеть, например,04.08.2020

кроме других ответов вы можете сделать это и так

 // дата из firebase представлена ​​как
    let time = {
      секунды: 1613748319,
      наносекунды: 47688698687,
    }
    
    const fireBaseTime = новая дата (
      время.секунды * 1000 + время.наносекунды / 1000000,
    );
    const date = fireBaseTime.toDateString ();
    const atTime = fireBaseTime.toLocaleTimeString ();


    console.log (дата, время);

2022 WebDevInsider