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/。クロームで開くと正常に動作します。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 に答える