Мой вопрос лежит в основе этого ... но, к сожалению, требуется длинное (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, чтобы показать правильную дату?)
Извините за длину - я просто очень смущен датами ...