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


613

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


3
나는 지금 같은 문제를 생각하고 있습니다. 흥미로운 접근법이 있습니다.
Tamás Pap

31
제목은 시간대를 요구하고 텍스트는 GMT 오프셋을 요구합니다. 이것들은 2 가지입니다. 시간대에는 DST에 대한 정보가 포함되어 있지만 utc 오프셋에는 없습니다. 시간대에는 이름과 기록이 있으며 오프셋에는 없습니다. 제목을 "JS에서 클라이언트의 gmt 오프셋 가져 오기"로 편집하는 것이 좋습니다.
citykid

시간대가 필요합니다. GMT 오프셋도 도움이 될 것입니다.
DaveWalley

9
여기에 대한 답변은 주로 오프셋에 중점을 둡니다 . 들어 시간대이 답변을 . 시간대 태그 위키의 "표준 시간대! = 오프셋"을 참조하십시오 .
Matt Johnson-Pint

7
이 Intl.DateTimeFormat ()를 사용하여 정확한 시간대를 얻을 수 resolvedOptions () timeZone가..
Mangesh Mandavgane

답변:


594

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

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

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


42
@abernier getTimezoneOffset부정확성에 대한 진술 이 유효합니까? 언급 한 기사는 2007 년 6 월 날짜이며 기능이 어떻게 정확하지 않은지 자세히 설명하지 않습니다. 그리고 실제로 jsTimezoneDetect당신이 지적한 라이브러리 getTimezoneOffset자체를 사용 합니다.
Mike

5
@abernier ES 1 이후의 표준이므로 지금은 구현 문제가 해결 될 것이라고 확신합니다. 즉, 7 살짜리 기사입니다.
LasagnaAndroid

49
var hrs = -(new Date().getTimezoneOffset() / 60) 일반적으로 사용되는 시간을 상쇄하기 위해
Edwin Daniels

6
일광 절약 시간제를 고려하지 않는 것 같습니다
Shahdat

21
timezone! =utc offset
bendytree

480

시간대를 계산하기 위해 오프셋을 사용하는 것은 잘못된 접근 방식이며 항상 문제가 발생합니다. 시간대와 일광 절약 규칙은 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속성이 정의되지 않은 상태로 유지되었습니다.


17
이것은 표준 시간대를 얻는 데 대한 유일한 대답이며 일부 사용자는 오프셋과 반대로 필요합니다. 따라서 2016-09의 업데이트로 Intl은 대부분의 최신 브라우저에서 작동하지만 Safari는 작동하지 않습니다. 해당 브라우저의 경우 여기에 상당히 정확한 자바 스크립트
user2085368

6
이것이 Safari에서 작동하는 것으로 확인되었습니다. (버전 10.0 사용)
BadPirate

2
이것이 모든 최신 브라우저에서 작동하면 좋을 것입니다. 그러나 IE11과 최신 Firefox는 모두 timeZone 속성에 대해 정의되지 않은 상태로 반환됩니다.
Haprog

7
Chrome 58, Edge 40 및 Firefox 53으로 테스트했습니다. 모두 작동합니다. IE 11에서는 작동하지 않으며 Opera를 테스트하지 않았습니다.
Suma

7
이 API에서 반환 한 시간대 목록을 찾는 데 시간이 걸렸습니다. 여기 있습니다 : en.wikipedia.org/wiki/List_of_tz_database_time_zones
Xavier Poinas

123

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

클라이언트 시간대를 멋지게 형식화하려면 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


4
시간대 이름을 추가 할 때 Chrome에서 손상되었습니다. split.length 대신 상수를 사용하지 마십시오 split[4] + " " + split[5]!
Christophe Roussy

4
이것은 (놀람, 놀라움) IE에서도 작동하지 않습니다. 방금 split Date 객체의 콘솔 덤프를 수행했습니다. Chrome, Firefox 및 Safari에서는 동일하지만 IE에서는 다릅니다. 따라서 상수 인덱스도 신뢰할 수 없습니다. 월요일 12 월 02 2013 10:22:50 GMT-0500 (EST) : Chrome, FF, Safari; 2013 년 12 월 2 일 10:22:50 EST 2013 : IE10
adimauro

1
고마워요! 브라우저 시간대를 표시하려고 시도했습니다 ..... ew Date (). toString (). match (/ ([AZ] + [\ +-] [0-9] +. *) /) [ 1] 정확히 내가 필요한 것입니다!
KiwiSunGoddess

1
작동하지 않습니다. 나를 위해 split포함 : ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]그래서 결과는Daylight Time)
DLeh

7
이것은 실제로 JS 시간의 실제 표현이 new Date().toString()로케일 설정에 전적으로 의존 한다는 것은 좋은 생각이 아닙니다 . 다른 고객의 결과물과 비슷한 결과를 기대하는 것은 매우 나쁜 생각입니다.
Octopus

71

정수로 분 단위로 오프셋을 얻는 방법에 대해서는 이미 답변을 받았지만 누구나 로컬 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))

1
첫 번째 패딩을 pad(parseInt(Math.abs(offset/60)), 2)올바르게 교체해야합니다 . 그렇지 않으면 내 경우와 같이 +5.530을 얻을 수 있습니다 ... 수학 플로어 등이 더 나은지 여부는 확실하지 않습니다. atleast 예상대로 +0530 제공
Abhinav Singh

정확히 내가 찾던 것. 감사 !
codesnooker

이것은 올바른 결과를 줄 것입니다 : this.pad (Math.floor ((Math.abs (offset / 60))), 2)
Vivek

패드 기능을 사용하는 대신이 작업을 수행하는 것이 더 쉽다는 것을 알았습니다. offset = (offset <0? "+": "-") + ( "0000"+ parseInt ((Math.abs (offset / 60)))) .slice (-4)
flurbius

67

당신이 사용할 수있는:

순간 시간대

<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

12
이것은 정답입니다. 이것은 오프셋이 아닌 실제 시간대 이름 을 제공하는 유일한 것입니다 . 시간대 오프셋은 이름에서 파생 될 수 있지만 그 반대는 아닙니다. DST 및 기타 미묘함으로 인해 여러 시간대는 연중 특정 요일에만 동일한 오프셋을 가질 수 있습니다.
Romain G

1
이를위한 기본 솔루션 인 Intl API가 있습니다. moment.js는 당시에는 훌륭한 라이브러리 였지만 현재 훨씬 더 작은 대안이 있습니다 ( dayjs , date-fns ). 순간은 크다 ; 클라이언트 응용 프로그램에는 권장하지 않습니다.
Dan Dascalescu

43

프로젝트에 함수를 작성하여 시간대를 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

일 바이올린


1
감사합니다! 이것이 내가 필요한 것입니다!
Jeremy Moritz

15

오프셋과 표준 시간대를 모두 제공하는 단일 라이너는 단순히 새 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포맷은 구현 의존적이기 때문에, 객체; 간단한 문자열 슬라이싱 방식은 여러 엔진에서 일관된 결과를 생성하지 못할 수 있습니다.


13

시도 getTimezoneOffset()Date목적 :

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

이 메소드는 표준 시간대 오프셋 (분)을 GMT와 로컬 시간 (분)의 차이로 리턴합니다.


9

자바 스크립트 :

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);


3
이 답변은 이전 답변이 제공하지 않은 것을 제공합니까?
Dan Dascalescu

7

moment.js :

moment().format('zz');

6
zzz1.6.0 참조 기준으로 사용되지 않습니다 momentjs.com/docs/#/displaying/format
MrUpsidown

3
@MrUpsidown 그것은 지금 Z그리고ZZ
brauliobo

4
@brauliobo이 매개 변수는 같은 것을 반환하지 않습니다. z와 zz는 시간대 (예 : CST)를 반환했지만 Z와 ZZ는 오프셋 (예 : -0600)을 반환합니다.
Luca Spiller

최신 문서 쇼가 .zoneAbbr()대체하고 zzz. 여기에
tabish89

1
moment.js는 당시에는 훌륭한 라이브러리 였지만 현재 훨씬 더 작은 대안이 있습니다 ( dayjs , date-fns ). 순간은 크다 ; 클라이언트 응용 프로그램에는 권장하지 않습니다.
Dan Dascalescu

6

현재 시간대를 다음과 같이 찾을 수 있습니다.

console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>


현재 시간대를 다음과 같이 찾을 수 있습니다.

console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>

두 API 모두 utc 오프셋을 분 단위로 반환합니다.


moment.js는 당시에는 훌륭한 라이브러리 였지만 현재 훨씬 더 작은 대안이 있습니다 ( dayjs , date-fns ). 순간은 크다 ; 클라이언트 응용 프로그램에는 권장하지 않습니다.
Dan Dascalescu

1
"dayjs를 사용하면 현재 시간대를 찾을 수 있습니다"는 정확 하지 않습니다. 시간대가 아니라 오프셋 만 찾을 수 있습니다. 또한 Dayjs는 시간대를 지원하지 않습니다 . 그 .utcOffset () 메소드는 기본 이상 간단한 래퍼입니다 getTimezoneOffset().
Dan Dascalescu

4

시간대 (시간)

var offset = new Date().getTimezoneOffset();
if(offset<0)
    console.log( "Your timezone is- GMT+" + (offset/-60));
else
    console.log( "Your timezone is- GMT-" + offset/60);

의견에서 언급 한대로 정확하게하려면 다음과 같이 시도해야합니다.

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

if(offset<0)
{
    var extraZero = "";
    if(-offset%60<10)
      extraZero="0";

    console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
    var extraZero = "";
    if(offset%60<10)
      extraZero="0";

    console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}


GMT-4.5를 반환하는 베네수엘라와 같이 한 시간이 아닌 시간대에는 작동하지 않습니다.
Mirko

그래 맞아. 0.5는 0.5 * 30 분을 의미합니다. 나는 이것이 0.5를주는 이유를 알았다고 생각합니까?
Abrar Jahin

예, GMT-4.5는 유효한 시간대가 아니므로 GMT-4가 되려면 약간의 추가 구문 분석이 필요합니다.
Mirko

@Mirko는 이제 답의 두 번째 부분입니다
Abrar Jahin

더 정확하게하려면 GMT 대신 UTC를 사용하십시오. [Hilton and McCarthy 2013, p. 231–2. ], Wikipedia
GMT-

3

"MST"또는 "EST"시간대 약어 만 필요한 경우 :

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}

사용 Date.toString()이 신뢰할 수 없으며 MDN이 그 이유를 설명합니다. 내 답변 에서 관련 섹션을 문서에서 붙여 넣었습니다 .
Dan Dascalescu

3

이 결과 연산자가 시간대와 반대임을 확인하십시오. 따라서 일부 수학 함수를 적용한 다음 숫자를 더 적게 검증하십시오.

여기에 이미지 설명을 입력하십시오

MDN 문서를 참조하십시오

var a = new Date().getTimezoneOffset();

var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;

console.log(res)


1
부정적인 가치의 경우, 일부 문제
Arun Prasad ES

1
round? 그것은해야한다 floor, 그렇지?
Qwertiy

3
function getLocalTimeZone() {
    var dd = new Date();
    var ddStr = dd.toString();
    var ddArr = ddStr.split(' ');
    var tmznSTr = ddArr[5];
    tmznSTr = tmznSTr.substring(3, tmznSTr.length);
    return tmznSTr;
}

예 : Thu Jun 21 2018 18:12:50 GMT + 0530 (인도 표준시)

O / P : +0530


사용 Date.toString()이 신뢰할 수 없으며 MDN이 그 이유를 설명합니다. 내 답변 에서 관련 섹션을 문서에서 붙여 넣었습니다 .
Dan Dascalescu


2

이 값은 사용자 컴퓨터에서 얻은 것이며 언제든지 중요하므로 중요하지 않다고 생각합니다. 대략적인 값을 얻은 다음 서버에서 GMT로 변환하고 싶습니다.

예를 들어, 대만에서 왔으며 "+8"을 반환합니다.

작업 예

JS

function timezone() {
    var offset = new Date().getTimezoneOffset();
    var minutes = Math.abs(offset);
    var hours = Math.floor(minutes / 60);
    var prefix = offset < 0 ? "+" : "-";
    return prefix+hours;
}


$('#result').html(timezone());

HTML

<div id="result"></div>

결과

+8

2

new Date(당신은 오프셋받을 수 있습니다), 당신이 할 수있는 시간대 이름을 얻을 수 있습니다 :

new Date().toString().replace(/(.*\((.*)\).*)/, '$2');

()날짜 끝 사이의 값 , 즉 시간대 이름 을 얻습니다 .


사용 Date.toString()이 신뢰할 수 없으며 MDN이 그 이유를 설명합니다. 내 답변 에서 관련 섹션을 문서에서 붙여 넣었습니다 . 또한이 답변은 이미 적어도 3 번 주어졌습니다.
Dan Dascalescu

2

이것은 내 해결책이 될 것입니다.


    // For time zone:
    const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
    
    // Offset hours:
    const offsetHours = new Date().getTimezoneOffset() / 60;
    
    console.log(`${timeZone}, ${offsetHours}hrs`);

1

에 대한 대안으로 new Date().getTimezoneOffset()moment().format('zz') , 당신은 또한 사용할 수 있습니다:

var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>

jstimezone도 버그가 많고 유지 관리되지 않습니다 ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )


moment.js는 당시에는 훌륭한 라이브러리 였지만 현재 훨씬 더 작은 대안이 있습니다 ( dayjs , date-fns ). 순간은 크다 ; 클라이언트 응용 프로그램에는 권장하지 않습니다.
Dan Dascalescu

1

이것을 사용하여 OffSet을 postive로 변환하십시오.

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);

-2

3 글자 문자열 (예 : "PDT") 만 찾고 Marquez의 답변을 시도했지만 브라우저 간 지원을 위해 약간 조정해야했습니다. 운 좋게도 문자열은 마지막으로 일치하는 항목입니다. :)

CoffeeScript에서 내가 한 일은 다음과 같습니다.

browserTimezone = ->
  userDate = new Date()
  zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
  userZone = zoneMatches[zoneMatches.length - 1]

IE8, IE9, Safari 9, Firefox 44 및 Chrome 48에서 작동


2
4 글자로 된 시간대가 있지만주의하십시오 : 예를 들어 CEST (중부 유럽 서머 타임)
jbrosi

사용 Date.toString()이 신뢰할 수 없으며 MDN이 그 이유를 설명합니다. 내 답변 에서 관련 섹션을 문서에서 붙여 넣었습니다 .
Dan Dascalescu

-3

moment.js와 jstz.js를 포함시키기 만하면됩니다.

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>

그리고 나서

<script>
$(function(){
 var currentTimezone = jstz.determine();
 var timezone = currentTimezone.name();
 alert(timezone);
});

</script>

-3

이것은 나를 위해 매우 좋은 일입니다.

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;

1
어떤 설명?

-4

당신은 단순히 이것을 시도 할 수 있습니다. 그것은 당신에게 현재 기계 시간을 반환합니다

var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())


이것이 내가 어떻게 생각해야하는지 : new Date(new Date().getTime()); 그것은 다음과 같이 표시 될 것이다 : "금요일 2018 년 12 월 28 일 10:15:23 GMT + 0100 (중부 유럽 표준시) {}"
darmis

-4

이것은 일을 할 것입니다.


var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);

Thu May 25 2017 21:35:14 GMT+0300 (IDT)

찾으시는 주소가 없습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.