답변 이 올바른 결과를 제공하지 않는다는 의심이 있습니다. 질문에서 asker는 사용자의 현재 시간대를 무시하고 서버에서 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)
따라서 페이지 방문자가 자신의 컴퓨터에 목표 시간대 (Europe / Helsinki)가 있지만 전 세계 거의 모든 지역에서 실패하는 경우에만 기능이 정확합니다. 그리고 서버 타임 스탬프는 일반적으로 Unix Epoch (1970 년 1 월 1 일 00:00:00 GMT) 이후의 시간 인 UTC로 정의 된 UNIX 타임 스탬프이므로 타임 스탬프에서 DST 또는 비 DST를 결정할 수 없습니다.
따라서 해결책은 사용자의 현재 시간대를 무시하고 날짜가 DST인지 여부에 관계없이 UTC 오프셋을 계산하는 방법을 구현하는 것입니다. Javascript에는 사용자의 현재 시간대가 아닌 다른 시간대의 DST 전환 이력을 결정하는 기본 방법이 없습니다. 우리는 모든 시간대의 전체 전환 이력으로 서버의 시간대 데이터베이스에 쉽게 액세스 할 수 있기 때문에 서버 측 스크립트를 사용하여 가장 간단하게이 작업을 수행 할 수 있습니다.
그러나 서버 (또는 다른 서버)의 시간대 데이터베이스에 액세스 할 수없고 타임 스탬프가 UTC 인 경우 Javascript에서 DST 규칙을 하드 코딩하여 유사한 기능을 얻을 수 있습니다.
유럽 / 헬싱키에서 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 ()을 사용하지 않는 것을 기억하십시오. 사용자 시간대를 처리해야하고 이것은 원하는 동작이 아니기 때문입니다.