UTC / ISO 8601格式的日期转换

时间:2017-08-17 07:20:27

标签: javascript date datetime datetime-conversion

我正在进行日期转换。 我将此2017-08-17 13:00:00日期格式转换为2017-08-17T13:00:00Z

工作示例:

var from_date;
var sdate = new Date( '2017-08-17 13:00:00' );
var utcSDate = sdate.toISOString();
from_date = utcSDate.replace('.000', '');
console.log(from_date);

但此代码会将时间从13:00:00更改为08:00:00。为什么会这样。任何的想法 ? 或者有人给我一个想法,将日期从我的输入转换为所需的输出,如上所述。

3 个答案:

答案 0 :(得分:0)

我建议只更换缺少的部分,而不使用Date对象,在那里输入当地时间并获得祖鲁时间。

var date = '2017-08-17 13:00:00',
    iso = date.replace(/(.{10}) (.{8})/, '$1T$2.000Z');

console.log(date);
console.log(iso);

答案 1 :(得分:0)

您可以从日期对象中减去偏移量:

var d = new Date();
var offsetInMinutes = d.getTimezoneOffset();
d.setMinutes(d.getMinutes() - offsetInMinutes);
d.toISOString()

答案 2 :(得分:0)

  

但此代码从13:00:00到08:00:00更改时间。为什么会这样   happeining。任何的想法 ?或者有人给我一个转换日期的想法   我对上述所需输出的输入。

字符串“2017-08-17 13:00:00”不是ECMA-262支持的格式,因此它的解析完全取决于实现,请参阅Why does Date.parse give incorrect results?如果将其解析为日期,它很可能被视为ISO 8601本地,即“2017-08-17T13:00:00”。 Safari将返回无效日期,Firefox会将其解析为本地日期。

因此,请始终避免使用内置解析器。

如果您只想重新格式化字符串,请将其作为字符串执行:

var s = '2017-08-17 13:00:00';
console.log(s.replace(' ','T') + 'Z');

但是,您只需将日期和时间从原来的任何时区更改为UTC + 0000。如果要考虑主机时区偏移量,那么您应该手动将字符串解析为日期(库可以提供帮助,但对于单个格式不是必需的),然后使用 toISOString

// Given a string in ISO 8601 like format, parse as local 
function parseISOLocal(s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1]-1, b[2], (b[3] || 0),
    (b[4] || 0), (b[5] || 0));
}

var s = '2017-08-17 13:00:00';

console.log(parseISOLocal(s).toISOString())