如何将小时数组调整到首选时区?

问题描述 投票:0回答:2

所以有一点上下文,我有一个24个数组的阵列 - 一天中每小时一个。

所以午夜,0指数,将是[133.00, 234.00],这将表明12至1230的133次行动和12:30至凌晨1点之间的234次行动。

我需要调整这些索引数组以在JS浏览器中考虑用户的时区,这样如果用户在纽约,0索引(用户主页的午夜)将显示在中国的偏移量中(明天中午12点,来自用户的透视)。

我一直在想一个解决方案,我有一个简单的功能,我能够想到的

function offsetHourIndex(hourIndex, dataCenterTimeZone) {
  let userTime = new Date().setHour(hourIndex)
  return moment(userTime).tz(dataCenterTimeZone).hour();
}

这种方法有多可靠?

javascript date momentjs
2个回答
1
投票

你的方法有一些问题:

  • 您假设本地时区中的当前日期是目标时区的正确日期。大多数时候,世界各地有两个日期活跃。例如,伦敦的2019-04-02 04:00是2019-04-01 23:00在纽约。如果你只需要从伦敦拿4小时但是把它应用到纽约的当前日期,你就创造了一个全新的时间点,过早的一天。
  • 你假设每天都会有24小时。在夏令时转换或标准时间更改的时区中,您可能在转换当天有更多或更少的当地时间。
  • 在向后过渡的情况下,存在一段模糊的当地时间。例如,当美国太平洋时间在11月从PDT移动到PST时,重复从1:00-1:59开始的小时。如果将来自两个小时的数据汇总到数组元素1中,则该小时的结果将高于正常结果。前向转换的情况恰恰相反 - 您将有一个小时没有数据。
  • 服务器的时区设置可能是一个变化无常的事情。如果更改数据中心怎么办?如果你搬到云端怎么办?如果您正在运营多个数据中心怎么办?如果服务器管理员认为通过更改系统时区影响他们正在影响的是任务栏或前面板上的读数等,那么它会影响您的应用程序怎么办?一般来说,人们应该从不依赖服务器的本地时区设置来避免这些事情。

您可以通过基于协调世界时(UTC)的所有内容来避免所有这些问题 - 尤其是阵列。然后,您可以不知道任何服务器时区设置,只需将当前UTC日期之外的所有内容作为基础,这在世界各地都是相同的。

这将为您提供索引中给定UTC小时的当地小时数:

var localHour = moment.utc({hour: hourIndex}).local().hour();

对于上述建议,您不需要时刻 - 时区。

但是,如果您确实需要从特定时区转换为浏览器本地时间,那么您将使用如下所示的时刻时区:

var localHour = moment.tz({hour: hourIndex}, timeZoneName).local().hour();

请注意,当您执行此操作时,您还有另一个问题 - 并非每个时区都会被整数个小时偏移。例如,印度使用UTC + 05:30。有许多是:30和一些是:45。通过仅跟踪小时数,您无法提供足够的信息以正确转换为正确的当地时间。您的结果可能会被一个人拒之门外。


0
投票

这看似合理。只要您具有正确格式化的输入,代码就应该工作。我喜欢这个功能的简洁和清晰。你担心可靠性的原因是什么?

你可以在你的问题中提到你在这里使用momentmoment-timezone包来通过它的函数(momenttz)在这行代码中获得你的数据:

return moment(userTime).tz(dataCenterTimeZone).hour();

如果没有你的例子中的导入,你的功能可能会显得有点神秘,因为这里的人们可以理解,例如:

import * as moment from 'moment';
import 'moment-timezone';
© www.soinside.com 2019 - 2024. All rights reserved.