我的服务器正在向我的Javascript客户端发送UTC时间戳。我目前在山区时间,目前处于夏令时(GMT-7),但是我所做的任何时区调整都仅应用-6偏移。
要确认javascript甚至知道我的时区,我执行了以下操作:
console.log(Date().toString());
,它输出以下内容:Mon Nov 19 2018 12:13:28 GMT-0700 (Mountain Standard Time)
。很明显,JS知道我目前在GMT-7。
现在,我的服务器正在发送2018-08-24T17:00:00
。因此,我使用moment.js进行了解析,将其转换为本地时区,然后格式化结果。
moment.utc(this.props.value).local().format('h:mm A')
结果值为11:00 AM
。 17:00:00-7偏移为10:00,即10:00 AM。为什么将javascript转换为11:00?如果尝试使用spacetime库,我会得到相同的结果:
const s = spacetime(this.props.value,'UTC')
s.goto(spacetime().timezone().name);
console.log(s.format('h:mm a')); // Also spits out 11:00 AM
如果我手动调整具有偏移量的矩对象,它将正常工作:
var m = moment.utc(this.props.value);
m.add(-(new Date()).getTimezoneOffset(), 'minutes');
console.log(m.format('h:mm A')) // Outputs the correct time: 10:00 AM
当Javascript清楚知道我所处的时区时,为什么moment
和spacetime
都不能正确调整我的时区? Chrome和Microsoft Edge都发生相同的问题。现在,我将使用上面的hacky解决方法,但是我更喜欢使用本机方法,因此我很好奇为什么这不起作用。有什么想法吗?
答案 0 :(得分:1)
2018-08-24T17:00:00
,DST 有效,因此您获得UTC-6 一切正常。
换句话说,当前是否有效并不重要,仅在有关日期是否有效。
关于这部分:
m.add(-(new Date()).getTimezoneOffset(), 'minutes');
不要那样做。您没有调整时区,而是选择了其他时间。