programing

브라우저에서 클라이언트 표준시 가져오기

magicmemo 2023. 8. 9. 20:39
반응형

브라우저에서 클라이언트 표준시 가져오기

클라이언트 브라우저에서 시간대를 가져오는 믿을 수 있는 방법이 있습니까?저는 아래 링크를 보았지만 더 강력한 솔루션을 원합니다.

JavaScript를 사용하여 표준 시간대 자동 탐지

JavaScript에서 시간대 탐지

5년 후에 우리는 그것을 위한 내장된 방법을 갖게 되었습니다!최신 브라우저의 경우 다음을 사용합니다.

const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);

IANA 표준 시간대 문자열을 반환하지만 오프셋은 반환하지 않습니다.자세한 내용은 MDN 참조 자료를 참조하십시오.

호환성 표 - 2019년 3월 기준으로 전 세계에서 사용 중인 브라우저의 90%에 대해 작동합니다.Internet Explorer에서 작동하지 않습니다.

종종 사람들이 "시간대"를 찾고 있을 때, 충분할 것은 단지"UTC 오프셋". 예를 들어, 서버가 UTC+5에 있고 클라이언트가 UTC-8에서 실행 중인지 확인하려고 합니다.


일반적으로 오래된 자바스크립트로.(new Date()).getTimezoneOffset()/60UTC에서 오프셋된 현재 시간 수를 반환합니다.

그것은 가능한 "갓챠"의 징후에 주목할 가치가 있습니다.getTimezoneOffset()반환 값(MDN 문서에서):

표준 시간대 오프셋은 UTC와 현지 시간의 차이(분)입니다.이는 로컬 시간대가 UTC보다 뒤에 있으면 오프셋이 양수이고 앞에 있으면 음수임을 의미합니다.예를 들어 표준 시간대 UTC+10:00(호주 동부 표준시, 블라디보스토크 표준시, 차모로 표준시)의 경우 -600이 반환됩니다.


그러나 시간/날짜 관련 Javascript 코드는 day.js를 사용하는 것이 좋습니다.이 경우 다음을 실행하여 ISO 8601 형식의 UTC 오프셋을 얻을 수 있습니다.

> dayjs().format("Z")
"-08:00"

고객이 이 정보를 쉽게 위조할 수 있다는 것을 언급하는 것은 아마도 의미가 있을 것입니다.

(참고: 이 답변은 원래 https://momentjs.com/, 을 권장했지만 dayjs는 더 현대적이고 작은 대안입니다.)

이 리포지토리 페이지 룸을 보십시오. 도움이 됩니다.

jstz.min.js를 다운로드하고 HTML 페이지에 기능을 추가합니다.

<script language="javascript">
    function getTimezoneName() {
        timezone = jstz.determine()
        return timezone.name();
    }
</script>

디스플레이 태그에서 이 기능을 호출합니다.

현재로서는 mbayloon의 답변에서 제안된 것처럼 jstz가 최선의 선택일 것입니다.

완전성을 위해, 그 방법에 표준이 있다는 것을 언급해야 합니다: Intl.Chrome에서 이미 확인할 수 있습니다.

> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"

(이것은 실제로 기준을 따르지 않으며, 이것은 라이브러리를 고수해야 하는 또 다른 이유입니다.)

모멘트 시간대를 사용하여 시간대를 추측할 수 있습니다.

> moment.tz.guess()
"America/Asuncion"

여기에 jsfidle이 있습니다.

현재 사용자 표준 시간대의 약어를 제공합니다.

여기 코드 샘플이 있습니다.

var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));

저는 UTC에서 브라우저 시간 오프셋과 DST를 인식하는지 여부를 결정하는 Josh Fraser가 취한 접근 방식과 유사한 접근 방식을 사용했습니다(그러나 그의 코드에서 다소 단순화됨).

var ClientTZ = {
    UTCoffset:  0,          // Browser time offset from UTC in minutes
    UTCoffsetT: '+0000S',   // Browser time offset from UTC in '±hhmmD' form
    hasDST:     false,      // Browser time observes DST

    // Determine browser's timezone and DST
    getBrowserTZ: function () {
        var self = ClientTZ;

        // Determine UTC time offset
        var now = new Date();
        var date1 = new Date(now.getFullYear(), 1-1, 1, 0, 0, 0, 0);    // Jan
        var diff1 = -date1.getTimezoneOffset();
        self.UTCoffset = diff1;

        // Determine DST use
        var date2 = new Date(now.getFullYear(), 6-1, 1, 0, 0, 0, 0);    // Jun
        var diff2 = -date2.getTimezoneOffset();
        if (diff1 != diff2) {
            self.hasDST = true;
            if (diff1 - diff2 >= 0)
                self.UTCoffset = diff2;     // East of GMT
        }

        // Convert UTC offset to ±hhmmD form
        diff2 = (diff1 < 0 ? -diff1 : diff1) / 60;
        var hr = Math.floor(diff2);
        var min = diff2 - hr;
        diff2 = hr * 100 + min * 60;
        self.UTCoffsetT = (diff1 < 0 ? '-' : '+') + (hr < 10 ? '0' : '') + diff2.toString() + (self.hasDST ? 'D' : 'S');

        return self.UTCoffset;
    }
};

// Onload
ClientTZ.getBrowserTZ();

, 드로시,,ClientTZ.getBrowserTZ()다음을 설정하는 기능이 실행됩니다.

  • ClientTZ.UTCoffsetUTC에서 브라우저 시간 오프셋(분)(예: CST는 -360분이며 UTC에서 -6.0시간);
  • ClientTZ.UTCoffsetT형식상의 상쇄에.'±hhmmD' (계속):'-0600D'는 , , 입니다.D 및 DST용 »S DST의 ; 비준(표 DST);
  • ClientTZ.hasDST(참 또는 거짓).

ClientTZ.UTCoffset일부 시간대에는 시간 간격띄우기(예: +0415)가 있기 때문에 시간이 아닌 분 단위로 제공됩니다.

뒤에 숨은 ClientTZ.UTCoffsetT 시간대에 제공되지 않음)와합니다.<select>리스트에합니다.

아닙니다. 믿을 수 있는 방법은 하나도 없고 절대 없을 것입니다.당신은 정말로 고객을 믿을 수 있다고 생각했나요?

언급URL : https://stackoverflow.com/questions/6939685/get-client-time-zone-from-browser

반응형