дата обработки для мобильного приложения, использующего Firebase в качестве бэкэнда - PullRequest
0 голосов
/ 02 ноября 2018

мой вопрос не относится к пожарной базе, и я думаю, что применимо в целом.

В моем случае мобильное приложение (гибридное приложение) работает в Индии, а серверная часть - это firebase с использованием nodejs. Это приложение для заказа еды.

Когда человек заказывает еду, мы используем (новое Date ()). GetTime () в мобильном приложении и передаем это как дату заказа.

Каждый раз, когда размещается заказ, триггер пожарной базы обновляет общую продажу за день до этого времени в объекте БД в реальном времени JSON. И чтобы сохранить общую продажу, мы используем начало дня в качестве метки времени. рассчитывается по формуле:

 var date = new Date()
 var ms = date.getTime();
 var msPerDay = 86400 * 1000;
 var timestamp =   ms - (ms % msPerDay);

Я думаю, что все это уже беспорядок, поскольку новый Date () будет давать разные значения в мобильном приложении в Индии и на сервере Firebase (запущенном на севере США) в одно и то же время.

Итак, какова практика обработки дат в моей ситуации?

1 Ответ

0 голосов
/ 02 ноября 2018

Когда выполняется new Date(), создается экземпляр Дата со значением времени, которое представляет текущее время UTC.

Для хостов с точными часами и правильной настройкой часового пояса даты, созданные в один и тот же момент, будут иметь значение времени независимо от того, где находится хост или его настройки часового пояса. Однако в эпоху «интернета вещей» хост может быть любым из огромного множества устройств, где часы и настройки могут быть не точными.

Так что вам действительно не следует полагаться на то, что клиент точен и использует время сервера для важных дел.

Когда вы делаете:

var date = new Date()
var ms = date.getTime();
var msPerDay = 86400 * 1000;
var timestamp =   ms - (ms % msPerDay);

вы устанавливаете время для начала дня UTC. Это эквивалентно:

var timestamp = new Date().setUTCHours(0,0,0,0);

Для 2018-11-02 это будет: 1541116800000.

Вы можете сохранить это, если хотите, но, возможно, вы хотите сохранить его как удобочитаемую дату, в этом случае:

var timestamp = new Date().toISOString().slice(0,10); // 2018-11-02 on 2 Nov 2018

может подойти, но обычно рекомендуется использовать полную строку, поэтому:

var d = new Date();
d.setUTCHours(0,0,0,0);
var timestamp = d.toISOString(); // 2018-11-02T00:00:00Z on 2 Nov 2018

Обратите внимание, что дата UTC отличается от локальной даты для периода смещения местного часового пояса (поэтому с полуночи до 05:30 по местному времени в Индии будет отображаться вчерашняя дата).

console.log(
  new Date(new Date().setUTCHours(0,0,0,0)).toISOString()
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...