0

我的 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);​

我做了一个 js 小提琴:http: //jsfiddle.net/mq72k/7/。如果你用chrome打开它,它会正常工作。如果您在 Safari 中打开它,它会显示相同输入的日期无效并且根本不起作用。我也尝试过改变字符串,添加空格,不同的顺序等。

有没有人知道如何解决这个跨浏览器兼容性问题?

4

3 回答 3

0

尝试使用外部插件来解析你的日期,比如Datejs

于 2012-04-26T12:52:20.610 回答
0

坦率地说,我很惊讶其他浏览器能正确解析字符串,因为你给日期对象的字符串是1:00 AM1/20/2012. 将日期放在首位,并在其间添加一个空格。

var timeIn = new Date($('#dateIn').val() + ' ' + $('#timeIn').val());
var timeOut = new Date($('#dateOut').val() + ' ' + $('#timeOut').val());

http://jsfiddle.net/mq72k/8/

于 2012-04-26T12:53:53.703 回答
-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
  }
}
于 2012-04-26T12:48:50.837 回答