0

次のコードは、jQuery UI の日付ピッカーに対して実行されます。JSON 応答にその日付のデータが含まれているかどうかに基づいて、日付が強調表示されます。これは Chrome (32.0.1675.2 カナリア) では正常に機能しますが、Firefox では機能しません。その理由を知っている人はいますか?ハイライトクラスはFFでは追加されません。

function( response ) {
            MyApp.events = response;
            //console.log(events[1]);
            $("#my-event-calendar" ).datepicker({

                beforeShowDay: function(date) {

                    var result = [true, '', null];
                    var matching = $.grep(MyApp.events, function(event) {
                        //console.log(new Date(event.Date).valueOf() );
                        dateToHighlight = new Date(event.Date).valueOf();
                        return dateToHighlight === date.valueOf();
                    });

                    if (matching.length) {
                        result = [true, 'highlight', null];
                    }

                    return result;
                },

Chrome ではconsole.log(new Date(event.Date).valueOf() );レンダリングし1380582000000ますが、Firefox ではこれは-1775005200000

更新、JSON データは次のようにフォーマットされます。

オブジェクト {日付: "2013-10-02T14:30:00+00:00", タイトル: "イベントのタイトル"}

4

1 に答える 1

0

Quantas の人が言うように、Date 関数に文字列を解析させるのは得策ではありません。日付文字列を手動で解析する方がはるかに優れています。また、2 桁の年は使用しないでください。

この場合、次のような関数が必要なようです。

// Expects date in format m/d/yy
// where all years are +2000
function parseEventDate(s) {
  s = s.split(/\D/);
  return new Date(+s[2]+2000, ++s[0], s[1]);
}

日付文字列を日付オブジェクトに変換します。日付オブジェクトは、クライアントのシステム設定に基づいて作成されることに注意してください。

編集

2013-10-02T14:30:00+00:00 のような ISO8601 形式を使用しています。これは ES5 と一致していますが、使用中のブラウザーのおそらく 25% の Date.parse メソッドではサポートされていないため (誰の統計を信じているかによって異なります)、最善の方法は依然として文字列を手動で解析することです。

以下は、日付と時刻が UTC であることを前提としています (これは ES5 が必要とするものです)。

// Expects date in format yyyy-mm-ddThh:mm:ssZ
// Assumes timezone offset is 0000
function parseEventDate(s) {
  s = s.split(/\D/);
  return new Date(Date.UTC(s[0], --s[1], s[2], s[3], s[4], s[5]));
}

タイムゾーン オフセットを含めたい場合は、もう少し作業が必要ですが、それほど多くはありません。

于 2013-10-21T12:57:36.647 に答える