0

Web ページに次の JavaScript を登録します。ユーザーがポストバックすると、txtTimeZoneOffSet 非表示フィールドが空白として返されることがあります。コンピューターでテストすると、常に値が得られます。さまざまなブラウザー (IE、FireFox、および Safari) で発生します。

ユーザーのオフセットを取得しようとしているので、ユーザーが日付を入力すると、サーバー上でそれを UTC に変換し、同じタイムゾーンですべてを処理できます。次に、日付をレンダリングして戻すときに、それが正しいことを確認します彼らのタイムゾーン。

<script type='text/javascript'>
      $(window).load(function () {
            var d = new Date();
            var tz = d.getTimezoneOffset();

            $('#txtTimeZoneOffSet').val(tz / 60);
        });
</script>

これが 100% の確率で機能しない理由が分かる人はいますか?

4

1 に答える 1

2

jQuery は問題ないように見えるので、JavaScript を無効にするか、jQuery をロードしない限り、なぜ機能しないのかわかりません。

ただし、ユーザーの現在のオフセットがすべての日付で同じになるという誤った仮定に取り組んでいます。サマータイムのあるタイムゾーンでは、間違っている可能性があります。

より良いアプローチは、ブラウザで UTC に変換することです。または、少なくとも getTimezoneOffset の呼び出しで問題の日付/時刻を使用してください。

更新された回答

あなたの質問に答えて、あなたが今持っているコードはすでに現在のオフセットを取得します。彼らが入力する可能性のある日付に対して同じオフセットになるという保証はありません. 例えば:

<input type="text" id="someDate" />
var someDateString = $('#someDate').val();
var dt = new Date(someDateString);
var offset = dt.getTimezoneOffset();

テキスト入力の値は可変であるため、多くのタイム ゾーンでは、1 月と 6 月のオフセットが異なります。そのため、ブラウザで UTC に変換することをお勧めします。

var someDateString = $('#someDate').val();
var dt = new Date(someDateString);
var s = dt.toISOString();

文字列sは ISO8601 形式で、すでに UTC に変換されています。

もちろん、私ならmoment.jsを使用してこれを行います。これにより、入力文字列の解析方法をより適切に制御できるからです。

通常、このアプローチで十分です。 ただし、おそらくユーザーが存在しないためにサーバーでこの変換を行う必要がある場合は、タイムゾーンを知っておく必要があります。オフセットだけでなく、実際のタイム ゾーン。timezone tag wikiの「Time Zone != Offset」を参照してください。

最善の方法は、彼らにそれを求めることです。このようなマップベースのピッカーはいい感じです。jsTimezoneDetectを使用して、デフォルトの選択を推測することもできます。最終的にはAmerica/New_York、サーバーで使用できるような文字列識別子を求めています。.Net では、これらをNoda Timeの TZDB プロバイダーで使用できます。

派手なライブラリが必要ない場合は、Windows のタイム ゾーンに固執し、 からドロップダウン リストを提示できます。TimeZoneInfo.GetSystemTimeZones()ここで、.Idはキーで、.DisplayNameは値です。

于 2013-08-13T22:41:21.827 に答える