Ich habe den Verdacht, dass die Antwort nicht das richtige Ergebnis liefert. In der Frage möchte der Fragesteller den Zeitstempel vom Server in die aktuelle Zeit in Hellsinki konvertieren, ohne die aktuelle Zeitzone des Benutzers zu berücksichtigen.
Es ist die Tatsache, dass die Zeitzone des Benutzers diejenige sein kann, auf die wir nicht vertrauen können.
Wenn z. Zeitstempel ist 1270544790922 und wir haben eine Funktion:
var _date = new Date();
_date.setTime(1270544790922);
var _helsenkiOffset = 2*60*60;//maybe 3
var _userOffset = _date.getTimezoneOffset()*60*60;
var _helsenkiTime = new Date(_date.getTime()+_helsenkiOffset+_userOffset);
Wenn ein New Yorker die Seite besucht, wird die Warnung (_helsenkiTime) gedruckt:
Tue Apr 06 2010 05:21:02 GMT-0400 (EDT)
Und wenn ein Finlander die Seite besucht, wird die Warnung (_helsenkiTime) gedruckt:
Tue Apr 06 2010 11:55:50 GMT+0300 (EEST)
Die Funktion ist also nur dann korrekt, wenn der Seitenbesucher die Zielzeitzone (Europa / Helsinki) in seinem Computer hat, aber in fast allen anderen Teilen der Welt ausfällt. Und da der Server-Zeitstempel normalerweise ein UNIX-Zeitstempel ist, der per Definition in UTC die Anzahl der Sekunden seit der Unix-Epoche (1. Januar 1970, 00:00:00 GMT) ist, können wir die Sommerzeit oder Nicht-Sommerzeit nicht anhand des Zeitstempels ermitteln.
Die Lösung besteht also darin, die aktuelle Zeitzone des Benutzers zu ignorieren und eine Methode zur Berechnung des UTC-Versatzes zu implementieren, unabhängig davon, ob das Datum in der Sommerzeit liegt oder nicht. Javascript verfügt nicht über eine native Methode zum Bestimmen des DST-Übergangsverlaufs einer anderen Zeitzone als der aktuellen Zeitzone des Benutzers. Dies können wir am einfachsten mithilfe eines serverseitigen Skripts erreichen, da wir einfachen Zugriff auf die Zeitzonendatenbank des Servers mit dem gesamten Übergangsverlauf aller Zeitzonen haben.
Wenn Sie jedoch keinen Zugriff auf die Zeitzonendatenbank des Servers (oder eines anderen Servers) haben UND der Zeitstempel in UTC ist, können Sie die ähnliche Funktionalität erhalten, indem Sie die DST-Regeln in Javascript fest codieren.
Um Daten in den Jahren 1998 - 2099 in Europa / Helsinki abzudecken, können Sie die folgende Funktion verwenden ( jsfiddled ):
function timestampToHellsinki(server_timestamp) {
function pad(num) {
num = num.toString();
if (num.length == 1) return "0" + num;
return num;
}
var _date = new Date();
_date.setTime(server_timestamp);
var _year = _date.getUTCFullYear();
// Return false, if DST rules have been different than nowadays:
if (_year<=1998 && _year>2099) return false;
// Calculate DST start day, it is the last sunday of March
var start_day = (31 - ((((5 * _year) / 4) + 4) % 7));
var SUMMER_start = new Date(Date.UTC(_year, 2, start_day, 1, 0, 0));
// Calculate DST end day, it is the last sunday of October
var end_day = (31 - ((((5 * _year) / 4) + 1) % 7))
var SUMMER_end = new Date(Date.UTC(_year, 9, end_day, 1, 0, 0));
// Check if the time is between SUMMER_start and SUMMER_end
// If the time is in summer, the offset is 2 hours
// else offset is 3 hours
var hellsinkiOffset = 2 * 60 * 60 * 1000;
if (_date > SUMMER_start && _date < SUMMER_end) hellsinkiOffset =
3 * 60 * 60 * 1000;
// Add server timestamp to midnight January 1, 1970
// Add Hellsinki offset to that
_date.setTime(server_timestamp + hellsinkiOffset);
var hellsinkiTime = pad(_date.getUTCDate()) + "." +
pad(_date.getUTCMonth()) + "." + _date.getUTCFullYear() +
" " + pad(_date.getUTCHours()) + ":" +
pad(_date.getUTCMinutes()) + ":" + pad(_date.getUTCSeconds());
return hellsinkiTime;
}
Anwendungsbeispiele:
var server_timestamp = 1270544790922;
document.getElementById("time").innerHTML = "The timestamp " +
server_timestamp + " is in Hellsinki " +
timestampToHellsinki(server_timestamp);
server_timestamp = 1349841923 * 1000;
document.getElementById("time").innerHTML += "<br><br>The timestamp " +
server_timestamp + " is in Hellsinki " + timestampToHellsinki(server_timestamp);
var now = new Date();
server_timestamp = now.getTime();
document.getElementById("time").innerHTML += "<br><br>The timestamp is now " +
server_timestamp + " and the current local time in Hellsinki is " +
timestampToHellsinki(server_timestamp);
Und dies druckt Folgendes unabhängig von der Zeitzone des Benutzers:
The timestamp 1270544790922 is in Hellsinki 06.03.2010 12:06:30
The timestamp 1349841923000 is in Hellsinki 10.09.2012 07:05:23
The timestamp is now 1349853751034 and the current local time in Hellsinki is 10.09.2012 10:22:31
Wenn Sie den Zeitstempel in einer Form zurückgeben können, in der der Versatz (Sommerzeit oder Nicht-Sommerzeit) bereits zum Zeitstempel auf dem Server hinzugefügt wurde, müssen Sie ihn natürlich nicht clientseitig berechnen und können die Funktion erheblich vereinfachen. ABER denken Sie daran, timezoneOffset () NICHT zu verwenden, da Sie sich dann mit der Zeitzone des Benutzers befassen müssen und dies nicht das gewünschte Verhalten ist.