Saya curiga, Jawabannya tidak memberikan hasil yang benar. Dalam pertanyaan, penanya ingin mengubah stempel waktu dari server ke waktu saat ini di Hellsinki dengan mengabaikan zona waktu pengguna saat ini.
Ini adalah fakta bahwa zona waktu pengguna bisa menjadi apa pun sehingga kami tidak dapat mempercayainya.
Jika mis. timestamp adalah 1270544790922 dan kami memiliki fungsi:
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);
Ketika seorang warga New York mengunjungi halaman, peringatan (_helsenkiTime) mencetak:
Tue Apr 06 2010 05:21:02 GMT-0400 (EDT)
Dan saat orang Finlandia mengunjungi halaman tersebut, alert (_helsenkiTime) mencetak:
Tue Apr 06 2010 11:55:50 GMT+0300 (EEST)
Jadi fungsinya benar hanya jika pengunjung halaman memiliki zona waktu target (Eropa / Helsinki) di komputernya, tetapi gagal di hampir setiap bagian lain dunia. Dan karena stempel waktu server biasanya stempel waktu UNIX, yang menurut definisi dalam UTC, jumlah detik sejak Unix Epoch (1 Januari 1970 00:00:00 GMT), kami tidak dapat menentukan DST atau non-DST dari stempel waktu.
Jadi solusinya adalah untuk MENGHINDARI zona waktu pengguna saat ini dan menerapkan beberapa cara untuk menghitung UTC offset apakah tanggal tersebut dalam DST atau tidak. Javascript tidak memiliki metode asli untuk menentukan riwayat transisi DST zona waktu lain selain zona waktu pengguna saat ini. Kita dapat mencapai ini paling sederhana dengan menggunakan skrip sisi server, karena kita memiliki akses mudah ke basis data zona waktu server dengan seluruh riwayat transisi dari semua zona waktu.
Tetapi jika Anda tidak memiliki akses ke database zona waktu server (atau server lain) DAN stempel waktunya dalam UTC, Anda bisa mendapatkan fungsi serupa dengan melakukan hard coding aturan DST dalam Javascript.
Untuk mencakup tanggal di tahun 1998 - 2099 di Eropa / Helsinki, Anda dapat menggunakan fungsi berikut ( 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;
}
Contoh penggunaan:
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);
Dan ini mencetak yang berikut terlepas dari zona waktu pengguna:
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
Tentu saja jika Anda dapat mengembalikan stempel waktu dalam bentuk yang offset (DST atau non-DST) sudah ditambahkan ke stempel waktu di server, Anda tidak perlu menghitungnya di sisi klien dan Anda dapat banyak menyederhanakan fungsinya. TAPI ingat untuk TIDAK menggunakan timezoneOffset (), karena Anda harus berurusan dengan zona waktu pengguna dan ini bukan perilaku yang diinginkan.