Ho il sospetto che la risposta non dia il risultato corretto. Nella domanda il richiedente vuole convertire il timestamp dal server all'ora corrente a Hellsinki ignorando il fuso orario corrente dell'utente.
È il fatto che il fuso orario dell'utente può essere qualsiasi cosa, quindi non possiamo fidarci di esso.
Se ad es. timestamp è 1270544790922 e abbiamo una funzione:
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);
Quando un newyorkese visita la pagina, viene stampato l'avviso (_helsenkiTime):
Tue Apr 06 2010 05:21:02 GMT-0400 (EDT)
E quando un finlandese visita la pagina, viene stampato l'avviso (_helsenkiTime):
Tue Apr 06 2010 11:55:50 GMT+0300 (EEST)
Quindi la funzione è corretta solo se il visitatore della pagina ha il fuso orario di destinazione (Europa / Helsinki) nel suo computer, ma fallisce in quasi ogni altra parte del mondo. E poiché il timestamp del server è solitamente UNIX timestamp, che è per definizione in UTC, il numero di secondi dall'Epoch Unix (1 gennaio 1970 00:00:00 GMT), non possiamo determinare l'ora legale o non DST dal timestamp.
Quindi la soluzione è NON RICORDARE il fuso orario corrente dell'utente e implementare un modo per calcolare l'offset UTC indipendentemente dal fatto che la data sia in DST o meno. Javascript non ha un metodo nativo per determinare la cronologia delle transizioni dell'ora legale di un fuso orario diverso da quello corrente dell'utente. Possiamo ottenere questo risultato più semplicemente utilizzando uno script lato server, perché abbiamo un facile accesso al database del fuso orario del server con l'intera cronologia delle transizioni di tutti i fusi orari.
Ma se non hai accesso al database del fuso orario del server (o di qualsiasi altro server) E il timestamp è in UTC, puoi ottenere la funzionalità simile codificando le regole DST in Javascript.
Per coprire le date negli anni 1998-2099 in Europa / Helsinki è possibile utilizzare la seguente funzione ( 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;
}
Esempi di utilizzo:
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);
E questo stampa quanto segue indipendentemente dal fuso orario dell'utente:
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
Ovviamente se puoi restituire il timestamp in una forma in cui l'offset (DST o non DST) è già aggiunto al timestamp sul server, non devi calcolarlo dal lato client e puoi semplificare molto la funzione. MA ricordati di NON usare timezoneOffset (), perché allora devi avere a che fare con il fuso orario dell'utente e questo non è il comportamento desiderato.