所以有一点上下文,我有一个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();
}
这种方法有多可靠?
你的方法有一些问题:
4
小时但是把它应用到纽约的当前日期,你就创造了一个全新的时间点,过早的一天。您可以通过基于协调世界时(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
。通过仅跟踪小时数,您无法提供足够的信息以正确转换为正确的当地时间。您的结果可能会被一个人拒之门外。
这看似合理。只要您具有正确格式化的输入,代码就应该工作。我喜欢这个功能的简洁和清晰。你担心可靠性的原因是什么?
你可以在你的问题中提到你在这里使用moment
和moment-timezone
包来通过它的函数(moment
和tz
)在这行代码中获得你的数据:
return moment(userTime).tz(dataCenterTimeZone).hour();
如果没有你的例子中的导入,你的功能可能会显得有点神秘,因为这里的人们可以理解,例如:
import * as moment from 'moment';
import 'moment-timezone';