Обработка дат в JS, локально и на сервере - PullRequest
0 голосов
/ 12 мая 2019

Мой вопрос лежит в основе этого ... но, к сожалению, требуется длинное (ish) объяснение:

Я создаю простое приложение для изучения. У меня есть бэкэнд API (написанный на хапи) и мобильное приложение, написанное на Vue NativeScript.

Люди должны проверить, когда задача завершена. Запрос POST отправляется API, который помечает задачу как выполненную и назначает время выполнения.

    async saveTask(payload, taskType, mongo) {
    try {
        payload.date = new Date();
        await mongo.db.collection(taskType).insertOne(payload);
        return {
            message: `Data Saved`
        };
    }
    catch (e) {
        console.log(e);
        throw e;
    }
}

Поскольку я использую Mongo - дата автоматически сохраняется как ISODate.

В моем мобильном приложении есть страница со списком всех задач и когда они были выполнены. Выбор даты позволяет вам просматривать определенный день. При выборе 10 мая я вижу результаты за 9 мая ... при выборе 9 мая я вижу результаты за 8 мая и т. Д.

При выборе пятницы 10 мая 2019 года -

My Date Picker возвращается (консоль зарегистрирована) 'Fri May 10 2019 00:00:00 GMT+0100 (BST)' ... При отправке этой даты на сервер сервер видел ее как 9 мая в связи с +1 часом британского летнего времени и возвращал результаты за 9 мая.

Итак, чтобы исправить это, я преобразовал дату, возвращенную из моего средства выбора, в ISOString (), и отправил эту преобразованную дату на сервер:

query.startDate = this.startDate.toISOString() возвращает '2019-05-09T23:00:00.000Z

На сервере я регистрирую полученные query.startDate и получаю

startDate: 2019-05-09T23:00:00.000Z

Однако, чтобы выполнить задачи 10 мая, мне нужно установить дату окончания

Для этого я опирался на Moment.js (это перебор?)

    filters.startDate = moment(query.startDate,'YYYY-MM-DD').startOf('day').toDate();
    filters.endDate =  moment(query.startDate,'YYYY-MM-DD').endOf('day').toDate();

    const query = {
        'date' : {
            '$gte' : filters.startDate,
            '$lt' :  filters.endDate
        }
    };

Момент возвращает эти даты:

{ startDate: 2019-05-09T23:00:00.000Z, endDate: 2019-05-10T22:59:59.999Z }

Возвращает все элементы из базы данных с датой 10 мая.

Мой вопрос: это самый эффективный / разумный способ справиться с этим. Что делать, если элемент добавляется в 00:00 часов британского летнего времени ... (23:00 часов UTC / GMT) ... моя endDate не заканчивается в 23:00, он заканчивается в 22:59 ... или я здесь путаюсь?

При обозначении задачи как выполненной, я должен установить полное время с локального устройства (я думаю, что нет - поскольку на сервере установлена ​​новая Дата, она сохраняется в БД Mongo в формате UTC - и я можете использовать момент или что-то еще, чтобы проанализировать ту сторону клиента UTC, чтобы показать правильную дату?)

Извините за длину - я просто очень смущен датами ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...