O, bir şüphe var Cevap doğru sonucu vermez. Soruda soruyu soran, kullanıcının geçerli saat dilimini göz ardı ederek zaman damgasını sunucudan Hellsinki'deki geçerli saate dönüştürmek ister.
Gerçek şu ki, kullanıcının zaman dilimi her ne olursa olsun olabilir, bu yüzden ona güvenemeyiz.
Örneğin. zaman damgası 1270544790922 ve bizim bir fonksiyonumuz var:
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);
Bir New Yorklu sayfayı ziyaret ettiğinde, uyarı (_helsenkiTime) yazdırılır:
Tue Apr 06 2010 05:21:02 GMT-0400 (EDT)
Ve bir Finlandiyalı sayfayı ziyaret ettiğinde, uyarı (_helsenkiTime) yazdırır:
Tue Apr 06 2010 11:55:50 GMT+0300 (EEST)
Bu nedenle, işlev yalnızca sayfa ziyaretçisinin bilgisayarında hedef saat dilimini (Avrupa / Helsinki) bulundurması, ancak dünyanın hemen hemen her yerinde başarısız olması durumunda doğrudur. Ve sunucu zaman damgası genellikle UNIX zaman damgası olduğundan, tanım gereği UTC'de olduğu için, Unix Epoch'tan (1 Ocak 1970 00:00:00 GMT) bu yana geçen saniye sayısı, zaman damgasından DST veya DST olmayanları belirleyemiyoruz.
Dolayısıyla çözüm, kullanıcının geçerli saat dilimini İPTAL ETMEK ve tarihin DST'de olup olmadığına bakılmaksızın UTC farkını hesaplamanın bir yolunu uygulamaktır. Javascript, kullanıcının geçerli saat dilimi dışında başka bir saat diliminin DST geçiş geçmişini belirlemek için yerel bir yönteme sahip değildir. Bunu en basit şekilde sunucu tarafı komut dosyasını kullanarak başarabiliriz, çünkü sunucunun zaman dilimi veritabanına tüm saat dilimlerinin tüm geçiş geçmişiyle kolayca erişebiliriz.
Ancak sunucunun (veya başka herhangi bir sunucunun) saat dilimi veritabanına erişiminiz yoksa VE zaman damgası UTC'deyse, Javascript'te DST kurallarını sabit kodlayarak benzer işlevselliği elde edebilirsiniz.
Avrupa / Helsinki'de 1998 - 2099 yıllarını kapsamak için aşağıdaki işlevi kullanabilirsiniz ( 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;
}
Kullanım örnekleri:
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);
Ve bu, kullanıcının saat dilimine bakılmaksızın aşağıdakileri yazdırır:
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
Elbette, zaman damgasını (DST veya DST olmayan) sunucudaki zaman damgasına önceden eklenmiş bir biçimde döndürebilirseniz, bunu istemci tarafında hesaplamanız gerekmez ve işlevi çok basitleştirebilirsiniz. ANCAK timezoneOffset () 'i KULLANMAYINIZ, çünkü o zaman kullanıcının saat dilimi ile uğraşmanız gerekir ve bu istenen davranış değildir.