【发布时间】:2021-05-10 16:02:35
【问题描述】:
我在节点(客户端和服务器 API)中创建的调度系统有问题。我的服务器是 UTC。
由于我希望我的时区与用户所在的任何地方保持一致,因此我根据用户提供的公司地址向用户建议了一个时区。目的是让用户能够从世界任何地方查看他们的日程安排详细信息,并且仍然可以看到相同的日期。例如。用户业务位于英国,他们安排在晚上 8 点进行预订。然后用户去亚洲度假,登录系统,仍然看到指定为晚上 8 点的预订,并且可以使用日历安排更多预订,然后可以在英国查看在国外时指定的日期。
到目前为止,这一直运行良好。我在注册时针对用户保存用户时区。我将日期存储在 postgres 数据库中没有时区。从数据库中检索时,我正在使用
date = moment(fetcheddate).tz(usertimezone, true);
当我在服务器/客户端边界工作时(并且期待一个时区),我正在使用:
date = moment(receiveddate).tz(usertimezone);
这可确保所有日期在使用时始终处于业务时区,明确目标是所有日期始终作为时刻对象读取,时间始终设置为 00:00:00。
在服务器上,我的业务逻辑大量使用 Moment 加/减; isSame/isBefore/isAfter 来生成该调度系统内部工作的新日期。
现在的问题。有时,我需要知道今天是什么日子。例如。在服务器上,我通过结束当前保存的大宗预订、设置为“昨天”并从“今天”开始新的大宗预订来更改大宗预订。 .
更详细地查看“更改块预订”场景:在服务器上,我通过调用 moment 生成“今天”,并转换为业务时区,使用 moment startOf('day') 删除时间信息。
今天 = moment().tz(usertimezone).startOf('day');
然后,我将我的新 blockbooking 对象的 startdate 设置为今天的值。
现在,如果用户与业务时区位于同一时区,那么这将完美运行。但是,如果他们当时在不同时区的国外工作,那么我会遇到问题,即我的开始日是外出的一天。
例如,我当前的预订保存信息的开始日期可能是“2021-02-06 00:00:00”。我选择在同一天(2 月 6 日)在国外更改此预订。我希望我的新开始日期也等于 6 号。但是,使用 today = moment().tz(usertimezone).startOf('day') 会导致我将 2 月 5 日作为我的新开始日期,这是一天。
我不能仅仅依靠使用 moment() 来获取正确的日期,因为服务器是 UTC。我能想到的唯一解决方案是使用
从客户端传递浏览器时区moment.tz.guess();
但我不确定我是否可以完全相信这种完整功能的调用,因为似乎可能存在许多错误。例如。 Return timezone name with Moment's guess().
我确信必须有一个我没有想到的解决方案。也许我选择使用业务时区来同步日期时间是一个问题。我认为在服务器边界传递没有时区的日期将适用于大多数功能,并且可能会简化事情,尽管我不确定。但我想我仍然遇到在 UTC 服务器上生成“今天”日期的问题。
有人对此有任何想法吗?我错过了什么?
更新:根据要求,我的主要问题是如何在服务器中获取“今天”的日期值,使其等于浏览器中的“今天”。然后必须将服务器中的“今天”日期与设置为用户业务时区的日期进行比较。或者,如果您有绕过此问题的替代实现,那么这也是可以接受的
【问题讨论】:
-
抱歉我的冗长问题。我看看能不能调整我本质上是想问,“当服务器在 UTC 并且用户在国外,并且他们当前的时区与他们存储的业务时区不同时,我如何才能从服务器获得今天的准确表示”关于以 UTC 存储所有内容,我的理解是在安排未来的约会时,您应该在将日期保存到数据库时省略时区信息。这有助于夏令时。
-
我开始怀疑解决方案是否是在客户端生成“今天”,并在没有时区信息的请求中传递这个,然后在服务器上添加业务时区信息......
标签: javascript node.js date timezone momentjs