У меня есть подозрение, что ответ не дает правильного результата. В вопросе спрашивающий хочет преобразовать временную метку с сервера в текущее время в Hellsinki, не обращая внимания на текущий часовой пояс пользователя.
Дело в том, что часовой пояс пользователя может быть любым, поэтому мы не можем ему доверять.
Если, например. отметка времени - 1270544790922 и у нас есть функция:
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);
Когда житель Нью-Йорка посещает страницу, alert (_helsenkiTime) печатает:
Tue Apr 06 2010 05:21:02 GMT-0400 (EDT)
А когда финляндец посещает страницу, alert (_helsenkiTime) печатает:
Tue Apr 06 2010 11:55:50 GMT+0300 (EEST)
Таким образом, функция верна только в том случае, если посетитель страницы имеет целевой часовой пояс (Европа / Хельсинки) на своем компьютере, но не работает почти во всех остальных частях мира. И поскольку отметка времени сервера обычно представляет собой отметку времени UNIX, которая по определению в UTC, количество секунд с начала эпохи Unix (1 января 1970 00:00:00 GMT), мы не можем определить DST или не-DST по отметке времени.
Таким образом, решение состоит в том, чтобы НЕ УЧИТЫВАТЬ текущий часовой пояс пользователя и реализовать какой-либо способ вычисления смещения UTC независимо от того, находится ли дата в летнем времени или нет. Javascript не имеет собственного метода для определения истории перехода на летнее время для другого часового пояса, кроме текущего часового пояса пользователя. Мы можем добиться этого проще всего, используя скрипт на стороне сервера, потому что у нас есть легкий доступ к базе данных часовых поясов сервера со всей историей переходов для всех часовых поясов.
Но если у вас нет доступа к базе данных часовых поясов сервера (или любого другого сервера) И метка времени находится в UTC, вы можете получить аналогичную функциональность, жестко закодировав правила DST в Javascript.
Чтобы охватить даты в 1998-2099 годах в Европе / Хельсинки, вы можете использовать следующую функцию ( 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;
}
Примеры использования:
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);
И это выводит следующее независимо от часового пояса пользователя:
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
Конечно, если вы можете вернуть метку времени в форме, в которой смещение (DST или не-DST) уже добавлено к метке времени на сервере, вам не нужно вычислять ее на стороне клиента, и вы можете значительно упростить функцию. НО не забывайте НЕ использовать timezoneOffset (), потому что тогда вам придется иметь дело с часовым поясом пользователя, а это нежелательное поведение.