我想将日期字符串解析为ISO格式。有时它有时没有工作。
//17.08.2016 00:23:51 doesent work
//01.08.2016 00:05:32 work
var ParsedData = "COPY FROM ABOVE";
console.log("#####Start Date converstion########");
console.log("BEFORE Parsed Date: -" + ParsedData + "-");
tempdate = new Date(ParsedData);
console.log("AFTER Parsed Date: " + tempdate);
tempdate = tempdate.toISOString();
console.log("ISO Parsed Date: " + tempdate);
} catch (e) {
console.log(e);
if (e instanceof TypeError) {
//console.log(e);
}
else if(e instanceof RangeError) {
tempdate = ParsedDate
}
else {
console.log("Error not catched: " + e);
}
}
console.log("Parsed Date: " + tempdate);
console.log("#####END Date converstion########");
产地:
开始日期转换在解析日期之前:2016年8月17日00:23:51 解析日期之后:无效日期 解析日期:17.08.2016 00:23:51
结束日期转换 开始日期转换在解析日期之前:01.08.2016 00:19:02 解析日期:2016年1月8日星期五00:19:02 GMT + 0100(CET) ISO解析日期:2016-01-07T23:19:02.000Z 解析日期:2016-01-07T23:19:02.000Z
结束日期转换我不知道为什么。我希望有人能告诉我原因。
此致
答案 0 :(得分:0)
建议不要使用Date.parse直到ES5,解析 字符串完全取决于实现。还有很多 不同主机解析日期字符串的差异,因此是日期 字符串应该手动解析(如果很多,库可以帮助 要适应不同的格式)。
自己解析字符串的一个例子。
var datetimes = ['17.08.2016 00:23:51', '01.08.2016 00:05:32'];
datetimes.forEach(function(datetime) {
var dateAndTime = datetime.split(' ');
var date = dateAndTime[0].split('.').reverse();
// month is zero indexed
date[1] -= 1;
var time = dateAndTime[1].split(':');
// assuming datetimes are UTC
dateAndTime = new Date(Date.UTC.apply(null, date.concat(time))).toISOString();
// if not UTC but local
//dateAndTime = new Date(date[0], date[1], date[2], time[0], time[1], time[2]).toISOString();
console.log(dateAndTime);
});
或者,如果原始字符串已经是UTC,那么您可以只操作字符串而不使用Date
。
var datetimes = ['17.08.2016 00:23:51', '01.08.2016 00:05:32'];
datetimes.forEach(function(datetime) {
var dateAndTime = datetime.split(' ');
var date = dateAndTime[0].split('.').reverse();
dateAndTime = date.join('-') + 'T' + dateAndTime[1] + '.000Z';
console.log(dateAndTime);
});
答案 1 :(得分:0)
强烈建议不要使用Date构造函数解析字符串(就像使用Date.parse一样,因为它等同于解析)。您使用的格式不是ECMA-262支持的格式,因此解析完全取决于实现。即使是语言规范中的格式也不会被使用中的浏览器始终支持,因此要么使用定制函数,要么使用库。
由于日期和时间没有任何时区信息,因此应将其视为本地信息。
将字符串解析为日期后,您可以使用 toISOString 来获取所需的格式,并指出它始终会以UTC格式返回日期和时间。
/* Parse string in DD.MM.YYYY HH:mm:ss format
** @param {string} s - string to parse
** @returns {Date} if string has invalid date components,
** an invalid Date is returned
*/
function parseString(s) {
var b = s.split(/\D/);
var d = new Date(b[2], --b[1], b[0], b[3], b[4], b[5]);
return d && d.getMonth() == b[1] && d.getHours() == b[3] &&
d.getMinutes() == b[4]? d : new Date(NaN);
}
console.log(parseString('17.08.2016 00:23:51').toISOString());
console.log(parseString('01.08.2016 00:05:32').toISOString());