我正在本地机器上为我的本地数据库创建一个新的event,而我的时区偏移量正在被服务器复制...

当我的应用程序的用户创建event时,客户端脚本会在将偏移时间发送到服务器之前计算和adds输入的TZ偏移量.你可以在我下面的req.body中看到这一点,在 Select 了9am CST开始和10am CST结束后(当前CST偏移是6小时).

它看起来很完美:

req.body  {
  event_name: '9am start from local machine to local db',
  description: 'Testing the timezone offset',
  type: 'mens basketball',
  event_start: '2023-12-13T15:00',  // 09:00 + 06:00 = 15:00
  event_end: '2023-12-13T16:00',    // 10:00 + 06:00 = 16:00
  location_name: 'Home',
  address: '111 West Ave, Austin, TX 78703'
}

这是从服务器端的createEvent函数记录的:

module.exports.createEvent = async (req, res) => {
    console.log("req.body ", req.body);   // req.body from above

    try {
        // if req.body.address is blank, prevent event.geometry from being set
        const geoData = await geocoder.forwardGeocode({
            query: req.body.address,
            limit: 1
        }).send()
        const event = new Event(req.body);
        if (req.body.address === '') {
            event.geometry.type = 'Point';
            event.geometry.coordinates = [0, 0];
        } else {
            event.geometry = geoData.body.features[0].geometry;
        }

        event.user = req.user._id;

        console.log("event ", event); // here, the start and end times have added 12 hours instead of 6
    
        await event.save();
        req.flash('success', 'Successfully made a new event!');
        res.redirect(`/events/${event._id}/addimage`)
    } catch (e) {
        req.flash('error', e.message);
        res.redirect('new');
    }
}

正如console.log("event ", event)旁边的 comments 中提到的,我的开始和结束时间不知何故在偏移量中增加了6个小时,使完整的偏移量达到12个小时.这可以在控制台中记录的event对象中看到:

event  {
  event_name: '9am start from local machine to local db',
  description: 'Testing the timezone offset',
  location_name: 'Home',
  address: '111 West Ave, Austin, TX 78703',
  geometry: { type: 'Point', coordinates: [ -97.727415, 30.33413 ] },
  event_start: 2023-12-13T21:00:00.000Z,  // 09:00 + 12:00 = 12:00
  event_end: 2023-12-13T22:00:00.000Z,    // 10:00 + 12:00 = 22:00
  type: 'mens basketball',
  activations: [],
  fans: [],
  _id: new ObjectId("6579c977e470980be127375c"),
  image: [],
  created: 2023-12-13T15:10:47.231Z,
  user: new ObjectId("63bd61b0793748758b8ef3fb")
}

另有stack overflow post条提到MongoDB Compass有时会给你调整好的时间,误导开发人员.然而,我确认我的MongoDB指南针和我的Mongoh终端shell 与控制台中的event对象具有相同的12小时偏移量.

最疯狂的是我的制作应用程序没有这个问题……我的开始和结束时间正确地存储在我的MongoDB Atlas上,并正确地呈现在客户端上.生产应用程序正在设置为UTC 00:00的Heroku服务器上运行.

我在两个环境中都在运行Mongoose、Express、Node和Ejs.

为什么会这样?

推荐答案

'2023-12-13T15:00'章模棱两可这个时间戳代表哪个时区?当跨系统边界传输时间戳时(例如从客户端到服务器),请始终在ISO 8601格式中添加timezone designator.如果你总是用UTC发送时间戳,并且不想改变你的有线格式,至少在将字符串传递给解析它的任何东西之前添加Z指示符(因为它可能会假设它的系统时区).

你应该寄'2023-12-13T09:00-06:00''2023-12-13T15:00Z'.MongoDB将正确解释这两个问题.

Javascript相关问答推荐

如何保持子画布元素的1:1宽高比?

不渲染具有HTML参数的React元素

在JavaScript中对大型级联数组进行切片的最有效方法?

禁用从vue.js 2中的循环创建的表的最后td的按钮

使用redux-toolet DelivercThunks刷新访问令牌

获取加载失败:获取[.]添加时try 将文档添加到Firerestore,Nuxt 3

字节数组通过echo框架传输到JS blob

在页面上滚动 timeshift 动垂直滚动条

将自定义排序应用于角形数字数组

当作为表达式调用时,如何解析方法decorator 的签名?

jQuery s data()[storage object]在vanilla JavaScript中?'

html + java script!需要帮助来了解为什么我得到(无效的用户名或密码)

CheckBox作为Vue3中的一个组件

Use Location位置成员在HashRouter内为空

将数组扩展到对象中

如何在DYGRAPS中更改鼠标事件和键盘输入

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

在渲染turbo流之后滚动到元素

如何从Reaction-Redux中来自API调用的数据中筛选值

如何在Java脚本中添加一个可以在另一个面板中垂直调整大小的面板?