웹 서버가 웹 페이지 내에서 사용자의 시간대를 결정할 수있는 표준 방법이 있습니까?
아마도 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
그래도 작동 할 수있는 몇 가지 옵션이 있습니다.
- 대부분의 최신 브라우저는 ECMAScript Internationalization API 구현에서 IANA 시간대를 지원 하므로 다음을 수행 할 수 있습니다.
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
답변
더 완벽한 방법이 있습니다.
- 사용자의 시간대 오프셋을 가져옵니다
- 일광 절약 경계에서 며칠을 테스트하여 일광 절약을 사용하는 영역에 있는지 확인하십시오.
발췌는 다음과 같습니다.
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을 통해)