2017-08-17 375 views
-1

我正在处理日期转换。 我日这2017-08-17 13:00:00格式转换为2017-08-17T13:00:00ZUTC/ISO 8601格式的日期转换

工作示例:

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:0008:00:00。为什么这是发生。任何想法 ? 或者有人给了我一个想法,将日期从我的输入转换为期望的输出,如上所述。

+0

toISOString()方法转换为UTC,因此您需要将偏移量添加到您的时间 –

+0

请您详细说明偏移量吗? –

+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);

+0

如果将来更改输入日期格式,该怎么办?它如何将新的日期格式转换为UTC? –

0

您可以从。减去你的约会对象的偏移量:

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

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

字符串“2017年8月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())