将中心时间日期转换为当前时区的ISO字符串

时间:2017-11-20 17:10:01

标签: javascript date datetime time

我知道的日期存储在中部时间。它具有以下格式: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的问题吗?我感到迷茫。

1 个答案:

答案 0 :(得分:0)

ISO 8601确实没有定义固定时区来表示日期/时间,但它确实定义了表示时区的符号和一些日期/时间格式:

Date and Time Formats

  

TZD =时区指示符(Z或+ hh:mm或-hh:mm)

Date.prototype.toISOString()

在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所示,或者只使用您自己的示例。