在JS中本地和服务器上处理日期

时间:2019-05-11 23:00:49

标签: javascript mongodb date datetime nativescript

我的问题是这个问题的底部...但是不幸的是,需要一个冗长的解释:

我正在构建一个简单的应用程序来学习。我有一个后端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客户端以显示正确的日期?)

很抱歉,我对日期感到非常困惑...

0 个答案:

没有答案