4

我有一个简单的系统,它在节点创建表单上,允许用户选择开始和结束日期以及小时和分钟:

问题是日期在中间的某个地方搞砸了,或者我不知道如何转换它。

在数据库中,两个值被保存如下:

start: "2019-08-01T14:00:00.000Z"
end: "2019-08-01T16:00:00.000Z"

似乎是正确的,就像在日期选择器中我选择了下午 2 点和 4 点一样。然后,使用momentjsand react-big-calendar,我尝试将该事件放入日历中。似乎每次都放+3小时。我想,这是因为它以 UTC 格式保存,而且我住在东欧,距 UTC 时间 +3 小时。

在此处输入图像描述

奇怪的是,当我向数据库发出请求时,我已经将时间转换为我自己的时间:

在此处输入图像描述

Thu Aug 01 2019 17:00:00 GMT+0300 (Eastern European Summer Time)

有人可以帮我吗?当我保存它们时,我希望返回和显示相同的时间,这意味着如果我选择下午 2 点,它应该是下午 2 点。我认为这里的解决方案是忽略时区,并始终以 UTC 显示所有内容?但是怎么做呢?momentjs如果有帮助,我可以访问。我试过这样的事情:

moment.utc(event.start);

但它仍然返回相同的值,即:

Thu Aug 01 2019 17:00:00 GMT+0300 (Eastern European Summer Time)
4

1 回答 1

3

当你设置 React-Big-Calendar 时,你定义了一个本地化器。默认情况下,日历将显示在用户正在使用的浏览器的本地时区。提供给日历的所有日期都将转换为当地时区。如果来自数据库的日期使用 +5 的偏移量,但您坐在 +3 中,它会自动将这些时间转换为显示 +3(UTC 之美的一部分)。

这是它可能变得棘手的地方。假设我想在 9 月 19 日到 9 月 21 日之间从我的数据库中获取所有值。从系统请求数据时,我必须记住这些偏移量。我可以使用 moment 并说moment('2019-09-19').startOf('day'),它会给我2019-09-19T00:00:00Z,但这对我来说并不完全正确,因为我的偏移量为 -5,这意味着我实际上需要2019-09-18T19:00:00Z开始我的一天。我的结束日期时间也是如此,我会说它会在需要的时候moment('2019-09-21').endOf('day')给我。2019-09-21T23:59:59Z2019-09-21T18:59:59Z

现在,我对此并不肯定(你必须做一些测试),但如果你使用它moment-timezone而不是moment可能会为你处理所有这些。您必须四处玩耍才能确定。

最后编辑moment-timezone:我用我的本地化器制定了时区处理。我把整个东西放在了一个GitHub 项目中,并创建了一个CodeSandbox 供人们使用。

真正的最终编辑:(0.36.0)最新版本的 RBC 现在有完整的时区支持,当使用momentLocalizer或新的luxonLocalizer. 文档站点还不是最新的,但是如果您在本地运行“示例”,您会找到所有信息。

于 2019-09-23T14:48:12.827 回答