사용자 시간대 결정 사용자의 시간대를 결정할 수있는 표준

웹 서버가 웹 페이지 내에서 사용자의 시간대를 결정할 수있는 표준 방법이 있습니까?

아마도 HTTP 헤더 또는 user-agent문자열의 일부 입니까?



답변

-new Date().getTimezoneOffset()/60;

이 방법 getTimezoneOffset()은 GMT에서 시간을 빼고 분을 반환합니다. 따라서 GMT-8에 거주하면 480을 반환합니다.

이것을 시간으로 나누려면 60으로 나눕니다. 또한 부호는 필요한 것과 반대입니다. 즉 표준 시간대의 GMT 오프셋이 아니라 표준 시간대의 GMT 오프셋을 계산합니다. 이 문제를 해결하려면 -1을 곱하면됩니다.

또한 w3school 은 다음과 같이 말합니다.

일광 절약 시간제를 사용하기 때문에 반환 값이 상수가 아닙니다.


답변

내가 본 시간대를 결정하는 가장 인기있는 (== 표준?) 방법은 단순히 사용자에게 묻는 것입니다. 웹 사이트에 가입이 필요한 경우 사용자의 프로필 데이터에 저장 될 수 있습니다. 익명 사용자의 경우 날짜는 UTC 또는 GMT 등으로 표시 될 수 있습니다.

나는 스마트 알렉이 되려고 노력하고 있지 않다. 때로는 일부 문제가 프로그래밍 컨텍스트 외부에서 더 나은 솔루션을 가지고 있다는 것입니다.


답변

HTTP 스펙에 포함하도록 제안되었지만 클라이언트 시간대를 지금까지보고 할 HTTP 헤더는 없습니다.

그것이 있다면 클라이언트 측 JavaScript를 사용하여 시간대를 가져 와서 Ajax 또는 다른 것을 사용하여 서버에 제출하려고합니다.


답변

JavaScript는 클라이언트의 현지 시간을 얻는 가장 쉬운 방법입니다. XMLHttpRequest 를 사용 하여 로컬 시간을 다시 보내도록 제안하고, 실패하면 IP 주소를 기반으로 감지 된 시간대로 폴백합니다.

지리적 위치에 관해서 는 여러 프로젝트에서 MaxMind GeoIP 를 사용 했으며 시간대 데이터를 제공하는지 확실하지 않지만 잘 작동합니다. 귀하가 비용을 지불하는 서비스이며 데이터베이스에 대한 월별 업데이트를 제공합니다. 여러 웹 언어로 래퍼를 제공합니다.


답변

먼저 JavaScript에서 시간대 감지가 불완전하다는 것을 이해하십시오. 객체 의 인스턴스를 사용하여 특정 날짜 및 시간에 대한 현지 시간대 오프셋 을 가져올 수 있지만 이는 같은 전체 IANA 시간대 와 동일하지 않습니다 .getTimezoneOffsetDateAmerica/Los_Angeles

그래도 작동 할 수있는 몇 가지 옵션이 있습니다.

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

결과는 코드가 실행중인 컴퓨터의 IANA 시간대 설정이 포함 된 문자열입니다.

지원되는 환경은 Intl 호환성 표에 나열 되어 있습니다. 확장 DateTimeFormat섹션 및 명명 된이 기능을보고 resolvedOptions().timeZone defaults to the host environment.

  • Luxon 과 같은 일부 라이브러리 는이 API를 사용하여와 같은 기능을 통해 시간대를 결정합니다 luxon.Settings.defaultZoneName.

    • 구형 웹 브라우저와 같이보다 광범위한 환경을 지원해야하는 경우 라이브러리를 사용하여 시간대에 대한 정확한 추측 을 할 수 있습니다. Intl사용 가능한 경우 먼저 API를 시도하여 사용할 수 있으며, 사용 가능하지 않은 경우 결과를 사용하여 내부 데이터 세트에서 적절한 시간대를 선택하여 여러 시점에서 오브젝트 의 getTimezoneOffset기능을 조사합니다 Date.

    jsTimezoneDetect순간 시간대는 이 기능을 가지고있다.

    // using jsTimeZoneDetect
    var tzid = jstz.determine().name();
    
    // using moment-timezone
    var tzid = moment.tz.guess();

    두 경우 모두 결과는 추측으로 만 생각할 수 있습니다. 대부분의 경우 추측이 정확할 수 있지만 전부는 아닙니다.

    또한이 라이브러리는 많은 오래된 JavaScript 구현이 현지 시간대 의 현재 일광 절약 시간제 규칙 만 알고 있다는 사실을 막기 위해 정기적으로 업데이트해야 합니다. 자세한 내용은 여기를 참조하십시오.

궁극적으로 더 나은 방법은 실제로 사용자에게 시간대를 요청하는 것입니다. 변경할 수있는 설정을 제공하십시오. 위의 옵션 중 하나를 사용하여 기본 설정 을 선택할 수 있지만 앱에서 해당 설정을 벗어날 수는 없습니다.

사용자 컴퓨터의 시간대 설정에 전혀 의존 하지 않는 완전히 다른 접근법도 있습니다 . 대신 위도 및 경도 좌표를 수집 할 수있는 경우 다음 방법 중 하나를 사용하여 해당 좌표를 표준 시간대로 해결할 수 있습니다 . 이것은 모바일 장치에서 잘 작동합니다.


답변

다음은 브라우저의 시간대를 결정하는 강력한 JavaScript 솔루션입니다.

>>> var timezone = jstz.determine();
>>> timezone.name();
"Europe/London"

https://bitbucket.org/pellepim/jstimezonedetect

부록 1 : 이제이 프로젝트는 GitHub에 있습니다 : https://github.com/pellepim/jstimezonedetect


답변

더 완벽한 방법이 있습니다.

  1. 사용자의 시간대 오프셋을 가져옵니다
  2. 일광 절약 경계에서 며칠을 테스트하여 일광 절약을 사용하는 영역에 있는지 확인하십시오.

발췌는 다음과 같습니다.

function TimezoneDetect(){
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
    var intMonth;
    var intHoursUtc;
    var intHours;
    var intDaysMultiplyBy;

    // Go through each month to find the lowest offset to account for DST
    for (intMonth=0;intMonth < 12;intMonth++){
        //go to the next month
        dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);

        // To ignore daylight saving time look for the lowest offset.
        // Since, during DST, the clock moves forward, it'll be a bigger number.
        if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
            intOffset = (dtDate.getTimezoneOffset() * (-1));
        }
    }

    return intOffset;
}

JS에서 TZ 및 DST 가져 오기 (Way Back Machine을 통해)