2012-06-04 4 views
6

私は、指定されたタイムゾーンを持つ認証されたユーザーを持っています。 "ベルリン、GMT + 1"この質問のためにのは、私はグローバルスコープでこれを持っているとしましょう:JavaScriptを使用してタイムゾーンを処理する最善の方法は何ですか

私は、新しいDateオブジェクトにそれを作成した場合ことを意味し、それに応じて動作するすべての日付関連のJSを持って最善の解決策は何
var timeZone = "Berlin"; 
var gmtDistance = 1; 

タイムゾーンを考慮に入れます。


私はそれはかなり簡単だろうと思ったが、私はGoogleの/ SO上でこれを行うのに最適な方法を見つけていないように見えます。私は外部の図書館を必要としない答えに特権を与えるでしょう。

答えて

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); 
+0

回答ありがとうございますが、最適ではないようです – marcgg

+0

こちらの投稿者は、https://bitbucket.org/pellepim/jstimezonedetectを代わりに使用することをお勧めします – Denis

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時刻の日付を固定することにより、「成功」機能の「データ」要素の値を返さ事前に解析します。これを実行した後、データをさらに処理する場合は、サーバーに戻す前にUNを修正する必要があります。そうしないと、オフセットでバックアップをポストすることになります。

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ビットも含まれていますが、例では使用されていませんが、完全性のためにそこにのみあります。

0

多分Dojoツールキットはあなたにそのことについていくつかのアイデアを与えることができ、[外部ライブラリをたくないという、事実による;)]

道場Toolkitは日付/時刻ハンドリングとフルとのために素敵なクラスが付属していますタイムゾーンをサポートしていてもローカリゼーションをサポートします。 http://dojotoolkit.org/api/1.6/dojo/date

関連する問題