2012-06-04 21 views
6

Ich habe einen authentifizierten Benutzer mit einer bestimmten Zeitzone, z. "Berlin, GMT + 1". Für die Zwecke dieser Frage lassen sagen, ich habe diese im globalen Bereich:Was ist der beste Weg, Zeitzonen mit Javascript zu behandeln

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

Was ist die beste Lösung alle datumsbezogenen haben JS sich entsprechend zu verhalten, dass heißt, wenn ich ein neues Date-Objekt erstellen, es berücksichtigt die Zeitzone.


Ich dachte, es ist ziemlich einfach sein würde, aber ich glaube nicht die perfekte Art und Weise zu finden, das SO/auf Google zu tun. Ich würde eine Antwort bevorzugen, die keine externe Bibliothek benötigt.

Antwort

0

Was ist mit so etwas?

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

Danke für die Antwort, aber es scheint nicht optimal – marcgg

+0

FYI, der Autor des Beitrags empfiehlt stattdessen https://bitbucket.org/pellepim/jstimezonedetect zu verwenden – Denis

1

Meine Präferenz ist es, alle Termine auf der Serverseite zu speichern UTC-Zeit verwendet wird, und wenn ich Daten am Umgang via AJAX aufruft, kommen wieder einen globalen Handler zu schaffen, die eine Analyse des Fall ist.

Im folgende Beispiel kann Sie einfach verwenden:

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... 
    } 
}); 

Aber es vorge parst alle zurückgegebenen Werte in der „Erfolg“ „data“ Element Funktion von Daten für die UTC-Zeit auf der Lokalzeit zu fixieren. Beachten Sie, dass Sie die Daten anschließend weiter verarbeiten müssen, bevor Sie sie an den Server zurücksenden, oder Sie werden sie mit dem Offset sichern.

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; 
    } 
}); 

All diese Einstellungen, um dies zu erreichen. Wenn Sie jetzt Dinge wie Daten in OnPostSuccess behandeln, können Sie sicherstellen, dass sie immer im richtigen Format sind - und immer in der richtigen Zeitzone.

Unabhängig davon, ob Sie die oben genannten AJAX Methoden verwenden, können Sie die fixdate Methode wie folgt:

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

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

das Beispiel in Aktion sehen, die die folgenden jsFiddle:

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

Hinweis: Dazu gehören auch die AJAX-Bits - diese werden aber im Beispiel nicht verwendet - nur dort der Vollständigkeit halber.

0

vielleicht Dojo Toolkit können Sie darüber einige Ideen [aufgrund der Tatsache, dass Sie eine externe Bibliothek nicht wollen;)]

Dojo Toolkit kommt mit einem netten Klasse für Datum/Zeit-Handling und mit voller Lokalisierungsunterstützung, sogar mit Unterstützung der Zeitzone.

Verwandte Themen