Safari中无法识别日期字符串

时间:2012-04-26 12:39:45

标签: javascript safari cross-browser

我的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中打开它,它会说相同输入的无效日期,根本不起作用。我也试过改变字符串,添加空格,不同的顺序等。

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

3 个答案:

答案 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());

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

答案 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
  }
}