0

JsonValueProviderFactory を使用して、webapi から JSON を返しています。ajax リクエストを行うと、JSON が返され、日付の JSON 表現を JavaScript の Date オブジェクトに変換しています。

data.StartDateTime = new Date(data.StartDateTime);

data.StartDateTime JSON は "2012-12-19T10:00:00" のようになり、FireFox に対するテストではかなりうまく機能しています。Chrome に対してテストすると、日付の処理が異なります。

各ブラウザをテストしました: new Date("2012-12-19T10:00:00")

FF: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}
IE: Date {Wed Dec 19 2012 03:00:00 GMT-0700 (Mountain Standard Time)}
Chrome: Date {Wed Dec 19 2012 03:00:00 GMT-0700 (Mountain Standard Time)}
Safari: Invalid Date

したがって、webkit はタイムゾーンを含める必要があるようです。ユーザーのタイムゾーン オフセットを計算し、それを JSON 日付値に追加すると、次のようになります。

新しい日付("2012-12-19T10:00:00-07:00")

FF: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}
IE: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}
Chrome: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}
Safari: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}

したがって、これらの調査結果に基づいて、JSON 日付表現にタイムゾーン オフセットを追加するだけで問題ないように思われます。これらの日付/時間は、実店舗での予定をスケジュールするためのものであるため、UTC 日付ではないことに注意してください。

JSON 日付値に追加するオフセットを取得するために、このメソッドを作成しました。

_calculateTimezoneOffset: function() {
            var offset = new Date().getTimezoneOffset(),
                hour = parseInt(offset / 60, 10),
                minutes = offset % 60,
                prefix = '-';

            if (offset > 0) {
                prefix = '-';
            } else {
                prefix = '+';
                hour *= -1;
            }

            if (hour < 10) {
                hour = prefix + '0' + hour;
            } else {
                hour = prefix + hour;
            }

            if (minutes < 0) {
                minutes *= -1;
            }   

            if (minutes < 10) {
                minutes = '00';
            }

            return hour + ':' + minutes;
        }

これを処理するより良い方法はありますか?すべてを再考した後、これを避けるために日付を UTC に変換し始めるかもしれません。いずれにしても問題について何か考えはありますか?

事前にご協力いただきありがとうございます。

4

1 に答える 1

0

この道を進むと、おそらく気が狂うでしょう...特にソフトウェアのメンテナンス中に。サーバーとクライアントは異なるタイムゾーンで動作する可能性があるため、通信を行うための最も安全で簡単な方法はUTC時間です。心配しないでください...ブラウザがUTC形式で受信した日付は、ブラウザの現地時間で表示されます。日付をJsonのブラウザーに送信する前に注意を払ってください。UTCで変換する必要はありません。このジョブは、すべてのjsonフォーマッターによって正しい方法で自動的に実行されます.... IF(および...の場合のみ)DateTimeTimeKindプロパティはUTCまたはローカルのいずれかに設定されます...このプロパティが適切に設定されている場合(つまり、その値が指定されていない場合)すべてのフォーマッターは、Jsonに送信する前にUTC形式で日付を正規化します。したがって、あなたの場合、日付が現地時間でepxressされる場合は、すべてのDateTimeのTimeKindがLocalに設定されていることを確認してから、JsonFormatterに渡します...これで十分です。

タイムゾーンに関連するすべての問題を詳細に分析するTimeZone関連の問題についてのブログ投稿を読むことをお勧めします:Asp.netMvcと日付とタイムゾーンの悪夢

于 2013-01-26T21:55:33.550 に答える