创建日期对象在Safari中返回NaN

时间:2016-01-30 21:06:36

标签: javascript angularjs

输入日期字符串为2016-01-11 23:00:00

$scope.formDate = function(date) {
  return new Date(date).getTime();
}

Chrome中的输出为1452549600000,Safari为NaN

如何使这种跨浏览器兼容?

2 个答案:

答案 0 :(得分:1)

  

如何使这种跨浏览器兼容?

将字符串分解为其组成部分,然后将它们提供给正确的Date构造函数:

$scope.formDate = function(date) {
    var matches = date.match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/);

    if (matches == null) {
        // An invalid date was entered
        return null;
    }

    var resultDate = new Date(
        parseInt(matches[1]), 
        parseInt(matches[2]) - 1, // months are 0 based in javascript
        parseInt(matches[3]),
        parseInt(matches[4]),
        parseInt(matches[5]),
        parseInt(matches[6])
    );

    return resultDate.getTime();
}

答案 1 :(得分:0)

您应该始终手动解析日期字符串,库可以提供帮助,但通常不需要。

OP中的格式不是有效的ISO字符串,这意味着浏览器可以按照自己的意愿对待它(并且当将其视为NaN时,Safari符合语言规范,即无效的日期字符串)。最接近的ISO 8601格式为“2016-01-11T23:00:00”。符合ISO标准的没有时区的字符串应视为本地字符串。

但是,根据浏览器的不同,浏览器可能会被视为UTC,本地或NaN。 将其解析为本地时间的简单函数是:

/**
* Parse an ISO string without validation
* @param {string} s - date string in format yyyy-mm-dd hh:mm:ss
* @returns {Date} parsed as a local date
*/
function parseISOSimple(s) {
  var b = s.split(/\D/);
  return new Date(b[0],b[1]-1,b[2],b[3],b[4],b[5]);
}

document.write('Simple: ' + parseISOSimple('2016-01-11 23:00:00'))