[javascript] JavaScript에서 클라이언트의 시간대 오프셋 가져 오기

방문자의 시간대 정보를 어떻게 수집 할 수 있습니까? 시간대와 GMT 오프셋 시간이 필요합니다.



답변

var offset = new Date().getTimezoneOffset();
console.log(offset);

시간대 오프셋은 UTC와 로컬 시간의 차이 (분)입니다. 이는 현지 시간대가 UTC보다 뒤에 있으면 오프셋이 양수이고, 앞에 있으면 네거티브임을 의미합니다. 예를 들어 시간대가 UTC + 10 (오스트레일리아 동부 표준시)이면 -600이 반환됩니다. 일광 절약 시간으로이 값이 지정된 로케일에 대해서도 일정하지 않습니다.

모든 시간대가 전체 시간으로 상쇄되는 것은 아닙니다. 예를 들어, Newfoundland는 UTC에서 3 시간 30 분을 뺀 것입니다 (일광 절약 시간을 방정식에서 제외).


답변

시간대를 계산하기 위해 오프셋을 사용하는 것은 잘못된 접근 방식이며 항상 문제가 발생합니다. 시간대와 일광 절약 규칙은 1 년에 여러 차례 변경 될 수 있으며 변경 사항을 따라 가기가 어렵습니다.

JavaScript로 시스템의 IANA 시간대 를 얻으려면

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

2019 년 9 월 현재 전 세계적으로 사용되는 브라우저의 95 %에서 작동합니다 .

이전 호환성 정보

ecma-402 / 1.0에 따르면 timeZone생성자에게 제공되지 않으면 정의되지 않을 수 있습니다. 그러나 향후 초안 (3.0)은 시스템 기본 시간대로 변경하여이 문제를 해결했습니다.

이 버전의 ECMAScript Internationalization API
에서
생성자에 제공된 옵션 객체에 속성이 제공 timeZone되지 않은 경우 timeZone속성은 정의되지 않은 상태로 유지됩니다Intl.DateTimeFormat
. 그러나 이후 버전에서는 호스트 환경의 현재 시간대를 식별하는 문자열 값을 대신 반환 할 수 있으므로 응용 프로그램은 이에 의존해서는 안됩니다.

ecma-402 / 3.0에서는 아직 초안이 남아 있습니다.

이 버전의 ECMAScript 2015 국제화 API
에서 생성자에 제공된 옵션 객체에 속성이 제공 timeZone되지 않은 경우이 timeZone속성은 기본 시간대의 이름
이됩니다
Intl.DateTimeFormat. 이 경우 이전 버전에서는
timeZone속성이 정의되지 않은 상태로 유지되었습니다.


답변

나는이 답변이 약간 벗어난 주제라는 것을 알고 있지만 많은 답변을 찾고있는 사람들은 표시를 위해 시간대를 형식화하고 아마도 영역 약어를 얻길 원한다고 상상합니다. 그래서 여기에 …

클라이언트 시간대를 멋지게 형식화하려면 JavaScript Date.toString 메소드를 사용하여 다음을 수행하십시오.

var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];

예를 들어 해당되는 시간대 분을 포함하여 “GMT-0400 (EST)”가 표시됩니다.

또는 정규식을 사용하면 원하는 부분을 추출 할 수 있습니다.

“GMT-0400 (EDT)”의 경우 :

new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]

“GMT-0400″의 경우 :

new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]

“EDT”의 경우 :

new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]

“-0400″만 :

new Date().toString().match(/([-\+][0-9]+)\s/)[1]

Date.toString 참조 : https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString


답변

정수로 분 단위로 오프셋을 얻는 방법에 대해서는 이미 답변을 받았지만 누구나 로컬 GMT 오프셋을 문자열로 원할 경우 "+1130":

function pad(number, length){
    var str = "" + number
    while (str.length < length) {
        str = '0'+str
    }
    return str
}

var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
          pad(parseInt(Math.abs(offset/60)), 2)+
          pad(Math.abs(offset%60), 2))


답변

당신이 사용할 수있는:

순간 시간대

<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>

// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();

브라우저에서 제공하는 정보가 거의 없기 때문에 브라우저 시간대 감지는 다소 까다로울 수 있습니다.

순간 시간대를 사용 Date.getTimezoneOffset()하고 Date.toString()현재 연도의 주위에 순간의 소수에 가능한 한 브라우저 환경에 대한 많은 정보로 수집 할 수 있습니다. 그런 다음 해당 정보를로드 된 모든 표준 시간대 데이터와 비교하고 가장 근접한 일치를 반환합니다. 동맹 인 경우 인구가 가장 많은 도시의 시간대가 반환됩니다.

console.log(moment.tz.guess()); // America/Chicago


답변

프로젝트에 함수를 작성하여 시간대를 hh:mm형식으로 반환 합니다. 이것이 누군가를 도울 수 있기를 바랍니다.

function getTimeZone() {
    var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
    return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}

// Outputs: +5:00

일 바이올린


답변

오프셋과 표준 시간대를 모두 제공하는 단일 라이너는 단순히 새 Date 객체에서 toTimeString () 을 호출 하는 것입니다. MDN에서 :

toTimeString()메서드는 Date 객체의 시간 부분을 미국 영어로 사람이 읽을 수있는 형태로 반환합니다.

중요한 것은 표준 시간대가 표준 IANA 형식이 아니라는 것입니다. “대륙 / 도시” IANA 형식 보다 다소 사용자 친화적 입니다. 사용해보십시오 :

console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);

캘리포니아에서는 현재 Intl API가을 toTimeString()반환 Pacific Daylight Time하는 동안 반환합니다 America/Los_Angeles. 콜롬비아에서는을 얻을 수 있습니다 Colombia Standard Time.America/Bogota .

이 질문에 대한 다른 많은 답변은 Date.toString ()을 호출하여 동일한 정보를 얻으려고 시도합니다. MDN은 다음 과 같이 이러한 접근 방식을 신뢰할 수 없습니다 .

날짜 인스턴스는 특정 시점을 나타냅니다. toString ()을 호출하면 사람이 읽을 수있는 형식으로 미국 영어 형식의 날짜를 반환합니다. […] 때때로 시간 부분의 문자열을 얻는 것이 바람직합니다. 그런 일은 달성 할 수 있습니다toTimeString() 방법 .

toTimeString()ECMA-262을 구현 호환 엔진으로부터 얻어진 문자열이 다를 수 있기 때문에있어서 특히 유용 toString()위한 Date포맷은 구현 의존적이기 때문에, 객체; 간단한 문자열 슬라이싱 방식은 여러 엔진에서 일관된 결과를 생성하지 못할 수 있습니다.