사용자의 시간대를 무시하고 Date ()가 특정 시간대를 사용하도록하는 방법
JS 앱 1270544790922
에서 서버 (Ajax)에서 타임 스탬프 (eq. )를 받습니다 .
해당 타임 스탬프 Date
를 기반으로 다음을 사용하여 객체를 만듭니다 .
var _date = new Date();
_date.setTime(1270544790922);
이제 _date
현재 사용자 로케일 시간대의 디코딩 된 타임 스탬프입니다. 나는 그것을 원하지 않는다.
_ date
이 (가)이 타임 스탬프를 유럽 헬싱키시의 현재 시간으로 변환하고 싶습니다 (사용자의 현재 시간대 무시).
어떻게 할 수 있습니까?
Date 객체의 기본 값은 실제로 UTC입니다. 이를 증명하기 위해 입력 new Date(0)
하면 다음과 같은 내용이 표시 Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
됩니다.. 0은 GMT에서 0으로 처리되지만 .toString()
메서드는 현지 시간을 표시합니다.
참고로 UTC는 세계 시간 코드를 의미 합니다. 현재 두 곳의 다른 위치에있는 현재 시간은 동일한 UTC이지만 출력 형식은 다르게 지정할 수 있습니다.
여기서 필요한 것은 몇 가지 서식입니다.
var _date = new Date(1270544790922);
// outputs > "Tue Apr 06 2010 02:06:30 GMT-0700 (PDT)", for me
_date.toLocaleString('fi-FI', { timeZone: 'Europe/Helsinki' });
// outputs > "6.4.2010 klo 12.06.30"
_date.toLocaleString('en-US', { timeZone: 'Europe/Helsinki' });
// outputs > "4/6/2010, 12:06:30 PM"
이것은 작동하지만 .... 사용자의 시간대를 설명하기 때문에 목적에 따라 다른 날짜 방법을 실제로 사용할 수 없습니다. 원하는 것은 헬싱키 시간대와 관련된 날짜 개체입니다. 이 시점에서 귀하의 옵션은 타사 라이브러리를 사용하거나 (권장) 날짜 개체를 해킹하여 대부분의 방법을 사용할 수 있도록하는 것입니다.
옵션 1-순간 시간대와 같은 타사
moment(1270544790922).tz('Europe/Helsinki').format('YYYY-MM-DD HH:mm:ss')
// outputs > 2010-04-06 12:06:30
moment(1270544790922).tz('Europe/Helsinki').hour()
// outputs > 12
이것은 우리가 다음에 할 일보다 훨씬 더 우아하게 보입니다.
옵션 2-날짜 개체 해킹
var currentHelsinkiHoursOffset = 2; // sometimes it is 3
var date = new Date(1270544790922);
var helsenkiOffset = currentHelsinkiHoursOffset*60*60000;
var userOffset = _date.getTimezoneOffset()*60000; // [min*60000 = ms]
var helsenkiTime = new Date(date.getTime()+ helsenkiOffset + userOffset);
// Outputs > Tue Apr 06 2010 12:06:30 GMT-0700 (PDT)
여전히 GMT-0700 (PDT)이라고 생각하지만 너무 세게 쳐다 보지 않으면 목적에 유용한 날짜 개체로 착각 할 수 있습니다.
나는 편리하게 부분을 건너 뛰었다. 정의 할 수 있어야합니다 currentHelsinkiOffset
. date.getTimezoneOffset()
서버 측에서 사용할 수 있거나 일부 if 문을 사용하여 시간대 변경이 발생할 때를 설명하면 문제가 해결됩니다.
결론 -특히이 목적을 위해 moment-timezone 과 같은 날짜 라이브러리를 사용해야한다고 생각 합니다 .
밀리 초와 사용자의 시간대를 고려하려면 다음을 사용하십시오.
var _userOffset = _date.getTimezoneOffset()*60*1000; // user's offset time
var _centralOffset = 6*60*60*1000; // 6 for central time - use whatever you need
_date = new Date(_date.getTime() - _userOffset + _centralOffset); // redefine variable
또 다른 접근 방식
function parseTimestamp(timestampStr) {
return new Date(new Date(timestampStr).getTime() + (new Date(timestampStr).getTimezoneOffset() * 60 * 1000));
};
//Sun Jan 01 2017 12:00:00
var timestamp = 1483272000000;
date = parseTimestamp(timestamp);
document.write(date);
건배!
I have a suspicion, that the Answer doesn't give the correct result. In the question the asker wants to convert timestamp from server to current time in Hellsinki disregarding current time zone of the user.
It's the fact that the user's timezone can be what ever so we cannot trust to it.
If eg. timestamp is 1270544790922 and we have a function:
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);
When a New Yorker visits the page, alert(_helsenkiTime) prints:
Tue Apr 06 2010 05:21:02 GMT-0400 (EDT)
And when a Finlander visits the page, alert(_helsenkiTime) prints:
Tue Apr 06 2010 11:55:50 GMT+0300 (EEST)
So the function is correct only if the page visitor has the target timezone (Europe/Helsinki) in his computer, but fails in nearly every other part of the world. And because the server timestamp is usually UNIX timestamp, which is by definition in UTC, the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT), we cannot determine DST or non-DST from timestamp.
So the solution is to DISREGARD the current time zone of the user and implement some way to calculate UTC offset whether the date is in DST or not. Javascript has not native method to determine DST transition history of other timezone than the current timezone of user. We can achieve this most simply using server side script, because we have easy access to server's timezone database with the whole transition history of all timezones.
But if you have no access to the server's (or any other server's) timezone database AND the timestamp is in UTC, you can get the similar functionality by hard coding the DST rules in Javascript.
To cover dates in years 1998 - 2099 in Europe/Helsinki you can use the following function (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;
}
Examples of usage:
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);
And this print the following regardless of user timezone:
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
Of course if you can return timestamp in a form that the offset (DST or non-DST one) is already added to timestamp on server, you don't have to calculate it clientside and you can simplify the function a lot. BUT remember to NOT use timezoneOffset(), because then you have to deal with user timezone and this is not the wanted behaviour.
Presuming you get the timestamp in Helsinki time, I would create a date object set to midnight January 1 1970 UTC (for disregarding the local timezone settings of the browser). Then just add the needed number of milliseconds to it.
var _date = new Date( Date.UTC(1970, 0, 1, 0, 0, 0, 0) );
_date.setUTCMilliseconds(1270544790922);
alert(_date); //date shown shifted corresponding to local time settings
alert(_date.getUTCFullYear()); //the UTC year value
alert(_date.getUTCMonth()); //the UTC month value
alert(_date.getUTCDate()); //the UTC day of month value
alert(_date.getUTCHours()); //the UTC hour value
alert(_date.getUTCMinutes()); //the UTC minutes value
Watch out later, to always ask UTC values from the date object. This way users will see the same date values regardless of local settings. Otherwise date values will be shifted corresponding to local time settings.
You could use setUTCMilliseconds()
var _date = new Date();
_date.setUTCMilliseconds(1270544790922);
'developer tip' 카테고리의 다른 글
자바 리플렉션-setAccessible (true)의 영향 (0) | 2020.08.27 |
---|---|
Python의 sys.path는 어디에서 초기화됩니까? (0) | 2020.08.27 |
개인 설정은 MSBuild 프로젝트 파일의 ProjectReference에서 무엇을합니까? (0) | 2020.08.27 |
jQuery : eq () 대 get () (0) | 2020.08.26 |
날짜 문자열 구문 분석 및 형식 변경 (0) | 2020.08.26 |