6

「ベルリン、GMT + 1」など、特定のタイムゾーンで認証されたユーザーがいます。この質問のために、私がこれをグローバルスコープに持っているとしましょう:

var timeZone = "Berlin";
var gmtDistance = 1;

日付に関連するすべての JS をそれに応じて動作させるための最良の解決策は何ですか。つまり、新しい Date オブジェクトを作成すると、タイムゾーンが考慮されます。


とても簡単だと思いましたが、Google/SO でこれを行う完璧な方法が見つからないようです。外部ライブラリを必要としない回答を歓迎します。

4

3 に答える 3

1

私の好みは、UTC 時間を使用してすべての日付をサーバー側に保存し、AJAX 呼び出しを介して返されるデータを処理するときに、何らかの解析を行うグローバル ハンドラーを作成することです。

次の例では、次のものを簡単に使用できます。

app.ajax({
    url: '/My/Post/Url',
    data: {
        MyProperty: 'MyValue'
    },
    success: function (data, status, xhr) {
        // Do stuff here...
    },
    error: function (xhr, settings, error) {
        // Do stuff here...
    }
});

ただし、UTC 時間の日付をローカル タイムゾーンに固定することにより、「success」関数の「data」要素で返された値を事前に解析します。注意 - これを行った後、データをさらに処理する場合は、サーバーに送り返す前に UN-fix する必要があります。そうしないと、オフセットを付けてポストアップすることになります。

var app = window.app = $.extend(true, {}, app, {
    // Creating a namespace for my app which is safe across multiple files.
    ajax: function (options) {
        var defaultSettings = {
            type: 'POST',
            async: true
        };

        // Capture the settings.
        var settings = $.extend(true, {}, defaultSettings, options);

        // Install our general handlers;
        if (settings.success) {
            settings.success = function (data, textStatus, jqXHR) {
                app.OnPostSuccess(data, textStatus, jqXHR, options.success);
            }
        } else 
            settings.success = app.OnPostSuccess;

        if (settings.error) {
            settings.error = function (jqXHR, ajaxSettings, thrownError) {
                app.OnPostError(event, jqXHR, ajaxSettings, thrownError, options.error);
            }
        } else
            settings.error = app.OnPostError;

        $.ajax(settings);
    },
    OnPostSuccess: function (data, textStatus, jqXHR, fn_after) {
        // Do my generalized success handling here.

        // Fix Dates.
        var fixedData = app.FixDate(data);

        // Call any other handler that's been specified.
        if (typeof fn_after === 'function')
            fn_after(fixedData, textStatus, jqXHR);
    },
    OnPostError: function (jqXHR, ajaxSettings, thrownError, fn_after) {
        // Do my generalized error handling here.

        // Call any other handler that's been specified.
        if (typeof fn_after === 'function')
            fn_after(jqXHR, ajaxSettings, thrownError);
    },
    FixDate: function (obj) {
        var fixed = obj;

        if (typeof obj == 'string' && obj.indexOf('\/Date(') == 0) {
            // Microsoft date "/Date(12345678)/" - convert to real date.
            fixed = new Date(parseInt(fixed.substr(6, fixed.length - 8), 10));
        }

        if (typeof fixed === 'object') {
            if (fixed.getTimezoneOffset) {
                // If the value is a date, apply timezone correction.
                var now = new Date();
                var offset = now.getTimezoneOffset(); // # of minutes from GMT.
                fixed = new Date(fixed.getTime() + offset * 60000);
                // This updates the value based on the offset.
            } else {
                // Otherwise, update each of its properties.
                // This fixes objects with dates for properties, recursively.
                $.each(fixed, function (index, value) {
                    fixed[index] = app.FixDate(value);
                });
            }
        }

        return fixed;
    }
});

これに到達するためのすべてのセットアップ。OnPostSuccess 内で日付などを処理するようになった場合、それらが常に正しい形式であり、常に正しいタイムゾーンであることを確認できます。

上記の AJAXメソッドを使用するかどうかに関係なく、次のようにFixDateメソッドを使用できます。

var MyObj = { 
    MyDate: "\/Date(12345678)\/"
};

console.log('Before: ', MyObj.MyDate);
MyObj = app.FixDate(MyObj);
console.log('After: ', MyObj.MyDate);

実際の例を確認するには、次の jsFiddle をチェックしてください。

http://jsfiddle.net/TroyAlford/TBNVV/

注: これには AJAX ビットも含まれますが、例では使用されていません。完全を期すためにのみ使用されています。

于 2012-06-13T23:55:14.300 に答える
0

たぶん、道場ツールキットはそれについていくつかのアイデアを与えることができます[事実、外部ライブラリが必要ないため;)]

Dojo Toolkit には、日付/時刻処理用の優れたクラスが付属しており、完全なローカリゼーション サポート (タイムゾーン サポートも含む) が付属しています。 http://dojotoolkit.org/api/1.6/dojo/date

于 2012-06-19T08:36:38.960 に答える
0

このようなものはどうですか?

http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/

var rightNow = new Date();
var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
var temp = jan1.toGMTString();
var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);
于 2012-06-04T16:40:32.137 に答える