gpt4 book ai didi

node.js - MongoDB 的奇怪日期行为

转载 作者:可可西里 更新时间:2023-11-01 09:58:49 26 4
gpt4 key购买 nike

我正在编写一个使用 MongoDB 作为其数据库的 React 应用程序。在数据库中保存和检索日期时,尤其是在更新特定文档中的日期时,似乎有一些奇怪的行为。

当我创建一个新文档时,一切都很好。但是,如果我尝试使用 ajax 调用编辑该文档上的日期,则存储在 MongoDB 中的日期比我选择的日期和浏览器中显示的日期早一天。下面的代码来解释更多。

使用 HTML5 选择日期 <input type='date' />元素。这是一些代码。我在不同的点包含了控制台日志以显示输出。假设我选择“2016 年 10 月 30 日”作为日期。为了在其他地方显示,日期和年份被分开,但在发送到服务器之前以 JS 日期对象的形式连接在一起(参见下面的代码)

React组件方法:

saveChanges(e, cancel){
e.preventDefault();
const cancelled = cancel ? true : false

console.log(this.state.date); // 30 Oct
console.log(this.state.year); // 2016

const saveData = {
id: this.props.data.id,
venue: this.state.venue,
unitNumber: this.state.unitNumber,
unitName: this.state.unitName,
date: this.state.date,
year: this.state.year,
day: this.state.day,
tutorID: this.state.tutorID,
cancelled: cancelled
}

editWorkshop(saveData, (data) => {
this.props.getWorkshopDetails();
this.props.workshopDetailsSaved(data);
});

}

上述方法将数据发送到editWorkshop.js , 外部 ajax 调用, 使用 axios:

import axios from 'axios';

export default function editWorkshop(input, callback){

const date = new Date(input.date + ' ' + input.year) // Rejoin date and year and convert to Date object
console.log(date); // Sun Oct 30 2016 00:00:00 GMT+0100 (BST)
const data = {
id: input.id,
venue: input.venue,
unitNumber: input.unitNumber,
unitName: input.unitName,
date: date,
day: input.day,
tutorID: input.tutorID,
cancelled: input.cancelled
}

axios.post('/editWorkshop', data).then(function(res){
callback(res.data);
})
}

最后是处理 ajax 调用的快速路由

const express = require('express');
const Workshop = require('../data/models/Workshop');

module.exports = function(req, res){

const data = req.body
console.log(data.date); // 2016-10-29T23:00:00.000Z - here is where it seems to go wrong - notice that the date has changed to 2016-10-29 instead of 10-30. This now gets written to the database
Workshop.update({ _id: data.id }, {
$set: {
unitNumber: data.unitNumber,
date: data.date,
venue: data.venue,
tutor: data.tutorID,
session: data.day,
cancelled: data.cancelled
}
}, function(err){
if (err) {
res.send(err);
return
}
var message = 'Workshop updated'
res.send({
success: true,
message: message
});
})

}

真正奇怪的是,当我从应用程序其他地方的数据库中检索数据时,它在浏览器中显示正确的日期 - 2016 年 10 月 30 日。

可以说这不是问题,因为显示的是正确的日期,但我对此不太满意,因为这些日期是应用程序的基本组成部分,我担心其中可能存在错误 future 。

任何人都可以阐明这一点吗?

最佳答案

2016-10-29T23:00:00.000ZSun Oct 30 2016 00:00:00 GMT+0100 (BST) 相同。

2016-10-29T23:00:00.000Z 处于 UTC(GMT) 时区。如果将其转换为 BST,您将获得相同的值。

MongoDB 将日期值保存为自纪元以来的 UTC 毫秒数。

来自docs :

MongoDB stores times in UTC by default, and will convert any local time representations into this form. Applications that must operate or report on some unmodified local time value may store the time zone alongside the UTC timestamp, and compute the original local time in their application logic.

关于node.js - MongoDB 的奇怪日期行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39895919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com