我的问题是这个问题的底部...但是不幸的是,需要一个冗长的解释:
我正在构建一个简单的应用程序来学习。我有一个后端API(用Hapi编写)和一个用Vue NativeScript编写的移动应用。
人们要检查任务何时完成。 POST请求被发送到API,该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。
在我的移动应用程序中,我有一个页面列出所有任务及其完成时间。日期选择器使您可以查看特定的日期。选择5月10日,我将看到5月9日的结果...选择5月9日,我将看到5月8日的结果,等等。
选择2019年5月10日(星期五)时-
我的日期选择器返回(控制台记录)'Fri May 10 2019 00:00:00 GMT+0100 (BST)'
...当将此日期发送到服务器时,由于英国夏令时+1小时,服务器将其视为5月9日,并返回5月9日的结果。
因此,要解决此问题,我将选择器返回的日期转换为ISOString(),并将此转换后的日期发送到服务器:
query.startDate = this.startDate.toISOString()
返回'2019-05-09T23:00:00.000Z
在服务器上,我记录接收到的query.startDate
并获取
startDate: 2019-05-09T23:00:00.000Z
但是,为了完成5月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
}
};
Moment返回以下日期:
{ startDate: 2019-05-09T23:00:00.000Z,
endDate: 2019-05-10T22:59:59.999Z }
从数据库中返回日期为5月10日的所有项目。
我的问题是:这是处理此问题的最有效/最明智的方法。 如果在英国夏令时00:00小时(UTC / GMT 23:00小时)添加了项目怎么办...我的endDate并未在23:00结束,而是在22:59结束...或者我在这里让自己感到困惑吗?
将任务标记为完成时,我应该在本地设备上设置完整时间(我想不是-由于服务器上设置了新日期,因此将其以UTC格式保存到Mongo DB中-可以使用moment或其他任何方法来解析该UTC客户端以显示正确的日期?)
很抱歉,我对日期感到非常困惑...