我知道的日期存储在中部时间。它具有以下格式:2017-11-19T23:39:35.280000
。我想将其转换为当前时区的ISO格式日期。我只是在创建一个new Date()
时让它工作 - 但是当我随后调用.toISOString()
时,它就变得混乱了。这是代码:
function convertCentralToLocal() {
const centralOffset = 360;
const dateInCentralMs = new Date('2017-11-19T23:39:35.280000').getTime();
const now = new Date();
const localOffset = now.getTimezoneOffset();
// this works: Sun Nov 19 2017 23:39:35 GMT-0600 (CST)
const d = new Date(dateInCentralMs + ((centralOffset - localOffset) * 60000));
// this seems to give the date six hours off: 2017-11-20T05:39:35.280Z
const iso = d.toISOString();
}
这是GMT的问题吗?我感到迷茫。
答案 0 :(得分:0)
ISO 8601确实没有定义固定时区来表示日期/时间,但它确实定义了表示时区的符号和一些日期/时间格式:
TZD =时区指示符(Z或+ hh:mm或-hh:mm)
在MDN,您可以读到时区将始终为零UTC偏移:
toISOString()方法以简化的扩展ISO格式(ISO 8601)返回一个字符串,该字符串的长度始终为24或27个字符(YYYY-MM-DDTHH:mm:ss.sssZ或±YYYYYY-MM-DDTHH:mm :分别为ss.sssZ)。 时区始终为零UTC偏移,由后缀“Z”表示。
这是Date.toISOStringMethod
的特殊性。与选择固定格式(YYYY-MM-DDTHH:mm:ss.sssZ
或±YYYYYY-MM-DDTHH:mm:ss.sssZ
)的方式相同,它已被选择为ISO表示的特定时区。
要解决此问题,您可以实施方法toISOString()
,如下面的this link所示,或者只使用您自己的示例。