我的JavaScript代码正在Chrome,IE和Firefox上运行,但是当它进入safari时它无效。我相信我已经缩小了问题:在JavaScript中创建“新日期”时,除了safari之外,所有其他浏览器都能识别我的字符串。
HTML:
<form>
<input id="timeIn" value="1:00 AM"/>
<input id="dateIn" value="1/20/2012"/>
<input id="timeOut" value="2:00 AM"/>
<input id="dateOut" value="1/21/2012"/>
</form>
JavaScript的:
function calcHours() {
// Build datetime objects and subtract
var timeIn = new Date($('#timeIn').val() + $('#dateIn').val());
if(!isValidDate(timeIn)) return -1;
var timeOut = new Date($('#timeOut').val() + $('#dateOut').val());
if(!isValidDate(timeOut)) return -1;
var hours = (timeOut - timeIn)/(1000*60*60);
return hours.toFixed(1);
}
function isValidDate(d) {
console.log(d);
if ( Object.prototype.toString.call(d) === "[object Date]" ) {
// it is a date
if ( isNaN( d.getTime() ) ) { // d.valueOf() could also work
// date is not valid
console.log("isn't valid");
return 0;
}
else {
// date is valid
console.log("is valid");
return 1;
}
}
else {
// not a date
console.log("isn't valid");
return 0;
}
}
var hours = calcHours();
console.log("Hours:", hours);
我做了一个小提琴:http://jsfiddle.net/mq72k/7/。如果你用chrome打开它,它会正常工作。如果你在Safari中打开它,它会说相同输入的无效日期,根本不起作用。我也试过改变字符串,添加空格,不同的顺序等。
有没有人知道如何解决这个跨浏览器兼容性问题?
答案 0 :(得分:0)
尝试使用外部插件来解析日期,例如Datejs
答案 1 :(得分:0)
坦率地说,我很惊讶其他浏览器正确解析字符串,因为你给日期对象的字符串是1:00 AM1/20/2012
。将日期放在第一位,并在其间添加一个空格。
var timeIn = new Date($('#dateIn').val() + ' ' + $('#timeIn').val());
var timeOut = new Date($('#dateOut').val() + ' ' + $('#timeOut').val());
答案 2 :(得分:-1)
Javascript根本不能很好地解析字符串日期,包括ISO8601格式。您必须自己解析字符串。你特别不应该期望一个像月/日/年这样的小格式被解析,因为它被少数全球人口使用。
顺便说一下,这与jQuery无关。
可靠地解析m / d / y格式:
function toDate(ds) {
var a = ds.split('/');
return new Date(+a[2], (a[0] - 1), +a[1]);
}
以上假设提供了正确的日期字符串。要同时检查它是否是有效日期:
function toDate(ds) {
var a = ds.split('/');
var d = new Date(+a[2], (a[0] - 1), +a[1]);
if (d.getDate() == a[1] && d.getFullYear() == a[2]) {
return d;
} else {
return NaN; // or some other suitable value like null or undefined
}
}