Tengo la sospecha de que el Answer no da el resultado correcto.En la pregunta, el asker quiere convertir la marca de tiempo del servidor a la hora actual en Hellsinki sin tener en cuenta la zona horaria actual del usuario.
Es el hecho de que la zona horaria del usuario puede ser lo que alguna vez lo que no podemos confiar a ella.
Si, por ejemplo. marca de tiempo es 1270544790922 y tenemos una función:
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);
Cuando un neoyorquino visita la página, alerta (_helsenkiTime) impresiones:
Tue Apr 06 2010 05:21:02 GMT-0400 (EDT)
Y cuando un Finlander visita la página, alerta prints (_helsenkiTime) :
Tue Apr 06 2010 11:55:50 GMT+0300 (EEST)
Así que la función es correcta sólo si el visitante página tiene el objetivo de zona horaria (Europa/Helsinki) en su computadora, pero falla en casi cualquier otra parte del mundo. Y debido a que la fecha y hora del servidor suele ser marca de tiempo UNIX, que es, por definición, en UTC, el número de segundos desde el Epoch Unix (1 enero 1970 00:00:00 GMT), no podemos determinar el horario de verano o no el horario de verano de marca de tiempo.
Así que la solución es hacer caso omiso de la zona horaria actual del usuario y poner en práctica alguna forma de calcular UTC compensado si la fecha está en el horario de verano o no. Javascript no tiene un método nativo para determinar el historial de transición de DST de otra zona horaria que la zona horaria actual del usuario. Podemos lograr esto de la manera más simple usando el script del lado del servidor, porque tenemos acceso fácil a la base de datos de la zona horaria del servidor con todo el historial de transición de todas las zonas horarias.
Pero si no tiene acceso a la base de datos de zona horaria del servidor (o de cualquier otro servidor) Y la marca de tiempo está en UTC, puede obtener la funcionalidad similar codificando las reglas de DST en Javascript.
Para cubrir las fechas en los años 1998 - 2099 en Europa/Helsinki se puede utilizar la siguiente función (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;
}
Ejemplos de uso:
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);
Y esta impresión la siguiente independientemente del usuario zona horaria:
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
Por supuesto, si puede devolver ti mestamp en una forma en que el desplazamiento (DST o no DST) ya está agregado a la marca de tiempo en el servidor, no tiene que calcularlo en el lado del cliente y puede simplificar mucho la función. PERO recuerda NO usar timezoneOffset(), porque entonces tienes que tratar con la zona horaria del usuario y este no es el comportamiento deseado.
Sé que el desplazamiento de zona horaria en Helsinki es +2 en invierno y +3 en horario de verano. ¿Pero quién sabe cuándo es DST? Solo algunos mecanismos de configuración regional que no están disponibles en JS – warpech
Es posible, pero no se usan métodos nativos de Javascript, porque javascript no tiene un método para determinar el historial de transición de otra zona horaria que la zona horaria actual del sistema del usuario (y es por cierto navegador dependiente al menos cuando vamos a las fechas de los 80). Pero de esta manera es posible: http://stackoverflow.com/a/12814213/1691517 y creo que mi respuesta le da el resultado correcto. –
http://www.w3schools.com/jsref/jsref_setutcmilliseconds.asp – radpin