输入日期字符串为2016-01-11 23:00:00
。
$scope.formDate = function(date) {
return new Date(date).getTime();
}
Chrome中的输出为1452549600000
,Safari为NaN
。
如何使这种跨浏览器兼容?
答案 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'))