Будет ли angularfire2 преобразовывать значения меток времени в js Date? - PullRequest
0 голосов
/ 14 мая 2018

При настройке firestore и angularfire2 в мае 2018 года вы получите следующее сообщение об ошибке:

 @firebase/firestore: Firestore (4.10.1): 
The behavior for Date objects stored in Firestore is going to change
AND YOUR APP MAY BREAK.
To hide this warning and ensure your app does not break, you need to add the
following code to your app before calling any other Cloud Firestore methods:

  const firestore = firebase.firestore();
  const settings = {/* your settings... */ timestampsInSnapshots: true};
  firestore.settings(settings);

With this change, timestamps stored in Cloud Firestore will be read back as
Firebase Timestamp objects instead of as system Date objects. So you will also
need to update code expecting a Date to instead expect a Timestamp. For example:

  // Old:
  const date = snapshot.get('created_at');
  // New:
  const timestamp = snapshot.get('created_at');
  const date = timestamp.toDate();

Please audit all existing usages of Date when you enable the new behavior. In a
future release, the behavior will change to the new behavior, so if you do not
follow these steps, YOUR APP MAY BREAK.

Я не совсем понимаю, что это будет означать на практике в приложении Angular в долгосрочной перспективе.В частности:

  1. Будет ли angularfire2 «обернутся» вокруг пожарного депо и решит эту проблему, преобразовав все в JS-Date?
  2. Нужно ли нам обновлять все запросы к пожарному хранилищу?использовать метку времени, а не дату в формате JS?
  3. Нужно ли преобразовывать все значения метки времени в метод Date (), как указано в фрагменте?

Спасибо за помощь.

обновление (дополнительная информация) Я нашел эту информацию, объясняющую, почему Firestore перемещается с даты на отметку времени в @firebase/firestore-types:

Отметка времени представляет собой момент времени, независимый от любогочасовой пояс или календарь, представленный в виде секунд и долей секунд с наносекундным разрешением во время UTC Epoch.Он закодирован с использованием Proleptic Gregorian Calendar, который расширяет григорианский календарь до первого года.Он кодируется в предположении, что длительность всех минут составляет 60 секунд, т. Е. Високосные секунды «размазаны», поэтому для интерпретации не требуется таблица високосных секунд.Диапазон от 0001-01-01T00: 00: 00Z до 9999-12-31T23: 59: 59.999999999Z.

Это также означает, что в машинописном тексте вы можете получить такой тип: import { Timestamp } from '@firebase/firestore-types'; Кстати, если вы перейдете в файл @ firebase / firestore-types / index.d.ts, есть ссылка на github с дополнительной информацией.

1 Ответ

0 голосов
/ 15 мая 2018

Вопрос 1"Будет ли angularfire2" обернутся вокруг пожарного депо и решит эту проблему, преобразовав все в JS-Date? "

Нет, это не имеет смысла, так как информация может быть потеряна (то есть, наносекунды).

Вопрос 2 «Нужно ли обновлять все запросы к пожарному хранилищу, чтобы использовать метку времени, а не дату JS?»

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

Вопрос 3"Нужно ли преобразовывать приведенные значения всех временных меток в Date (), как проинструктированы во фрагменте? "

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

Метка времени против даты Javascript (требуется помощь)

Я создал эту небольшую таблицу, чтобы понять выбор перехода от даты к отметке времени

+----------------+------------------------------+---------------------------------+-------------------------------------+
|                |        javascript Date       |      firestore "Timestamp"      |         comment/implication         |
+----------------+------------------------------+---------------------------------+-------------------------------------+
| precision      | milliseconds                 | nanosecond                      | better resolution. two objects      |
|                |                              |                                 | created right after each other can  |
|                |                              |                                 | have the same millisecond,          |
|                |                              |                                 | but not nanosecond.                 |
+----------------+------------------------------+---------------------------------+-------------------------------------+
| specific point | Can be both                  |      Yes - independent of       |           ? (help wanted)           |
| in time        |                              |  any time zone or calendar..."  |                                     |
+----------------+------------------------------+---------------------------------+-------------------------------------+
| range          |  8,640 * 10^12 milliseconds  |          Range is from:         |   This restriction on Timestamp,    |
|                | to either side of 01 January |      0001-01-01T00:00:00Z       |    makes it possible to convert     |
|                |          , 1970 UTC          |                to               |      to RFC 3339 date strings.      |
|                |                              | 9999-12-31T23:59:59.999999999Z. |                                     |
+----------------+------------------------------+---------------------------------+-------------------------------------+
| leap seconds   | ignored                      | leap seconds are "smeared"      | ? (help wanted)                     |
+----------------+------------------------------+---------------------------------+-------------------------------------+
| calendar       | Gregorian Calendar?          | Proleptic Gregorian Calendar    | The Gregorian Calendar              |
|                |                              |                                 | only goes back to 1582,             |
|                |                              |                                 | Proleptic goes back to 0001.        |
+----------------+------------------------------+---------------------------------+-------------------------------------+

Источники

Я использовал следующие источники информации:

  1. Сообщение об ошибке вы можете увидеть в вопросе
  2. Файл @ firebase / firestore-types / index.d.ts
  3. Ссылка , предоставленная там github
  4. Спецификация языка ECMAScript
  5. Этот вопрос о переполнении стека .
...