programing tip

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

itbloger 2020. 10. 4. 10:39
반응형

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


방문자의 시간대 정보를 수집하려면 어떻게해야합니까? 시간대와 GMT 오프셋 시간이 필요합니다.


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

시간대 오프셋은 UTC와 현지 시간의 차이 (분)입니다. 이는 현지 시간대가 UTC보다 뒤 떨어지면 오프셋이 양수이고 앞면 음수임을 의미합니다. 예를 들어 시간대가 UTC + 10 (호주 동부 표준시)이면 -600이 반환됩니다. 일광 절약 시간은 주어진 로케일에 대해서도이 값이 상수가되는 것을 방지합니다.

모든 시간대가 전체 시간으로 오프셋되는 것은 아닙니다. 예를 들어, 뉴 펀들 랜드는 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 Internationalization 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)"을 제공합니다.

또는 regex를 사용하여 원하는 부분을 추출 할 수 있습니다.

"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

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);
}


// See output
document.write(getTimeZone());

작업 바이올린


시도 getTimezoneOffset()Date목적 :

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

이 메서드는 GMT와 현지 시간 (분) 간의 차이 인 표준 시간대 오프셋 (분)을 반환합니다.


자바 스크립트 :

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


오프셋과 표준 시간대를 모두 제공하는 한 줄짜리는 단순히 새 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);

캘리포니아에서 지금 toTimeString()돌아 Pacific Daylight Time국제 API를 반환하는 동안 America/Los_Angeles. 콜롬비아에서는 Colombia Standard Time, 대 America/Bogota.

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

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

toTimeString()방법은 형식이 구현에 따라 다르기 때문에 ECMA-262를 구현하는 호환 엔진 toString()Date객체에 대해 얻은 문자열이 다를 수 있기 때문에 특히 유용합니다 . 단순 문자열 슬라이싱 접근 방식은 여러 엔진에서 일관된 결과를 생성하지 못할 수 있습니다.


moment.js :

moment().format('zz');

, 당신은 현재의 시간대를 찾을 수 있습니다

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 오프셋을 분 단위로 반환합니다.


시간대-

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));
}


"MST"또는 "EST"시간대 약어 만 있으면됩니다.

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

이 결과 연산자가 Timezone과 반대임을 확인하십시오. 그래서 일부 수학 함수를 적용한 다음 숫자를 적거나 더 검증하십시오.

여기에 이미지 설명 입력

MDN 문서 참조

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

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

console.log(res)


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;
}

예 : 2018 년 6 월 21 일 목요일 18:12:50 GMT + 0530 (인도 표준시)

O / P : +0530


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

For example, I am from Taiwan and it returns "+8" for me.

Working example

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>

Result

+8

On the new Date() you can get the offset, to get the timezone name you may do:

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

you get the value between () in the end of the date, that is the name of the timezone.


Try this,

new Date().toString().split("GMT")[1].split(" (")[0]

As an alternative to new Date().getTimezoneOffset() and moment().format('zz'), you can also use :

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 is also quite buggy and unmaintained (https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open)


Use this to convert OffSet to postive:

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

I was looking for just the 3 letter string (like "PDT") and tried Marquez's answer but had to tweak it a bit for cross browser support. Luckily, the string is the last potential match :)

Here's what I did, in 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에서 작동합니다.


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>

이것은 저에게 매우 좋은 일입니다.

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

간단히 시도해 볼 수 있습니다. 현재 기계 시간을 반환합니다.

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


이것은 일을 할 것입니다.


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

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

찾으시는 주소가 없습니다

참고 URL : https://stackoverflow.com/questions/1091372/getting-the-clients-timezone-offset-in-javascript

반응형