방문자의 시간대 정보를 어떻게 수집 할 수 있습니까? 시간대와 GMT 오프셋 시간이 필요합니다.
방문자의 시간대 정보를 어떻게 수집 할 수 있습니까? 시간대와 GMT 오프셋 시간이 필요합니다.
답변:
var offset = new Date().getTimezoneOffset();
console.log(offset);
시간대 오프셋은 UTC와 로컬 시간의 차이 (분)입니다. 이는 현지 시간대가 UTC보다 뒤에 있으면 오프셋이 양수이고, 앞에 있으면 네거티브임을 의미합니다. 예를 들어 시간대가 UTC + 10 (오스트레일리아 동부 표준시)이면 -600이 반환됩니다. 일광 절약 시간으로이 값이 지정된 로케일에 대해서도 일정하지 않습니다.
모든 시간대가 전체 시간으로 상쇄되는 것은 아닙니다. 예를 들어, Newfoundland는 UTC에서 3 시간 30 분을 뺀 것입니다 (일광 절약 시간을 방정식에서 제외).
getTimezoneOffset
부정확성에 대한 진술 이 유효합니까? 언급 한 기사는 2007 년 6 월 날짜이며 기능이 어떻게 정확하지 않은지 자세히 설명하지 않습니다. 그리고 실제로 jsTimezoneDetect
당신이 지적한 라이브러리 getTimezoneOffset
자체를 사용 합니다.
var hrs = -(new Date().getTimezoneOffset() / 60)
일반적으로 사용되는 시간을 상쇄하기 위해
timezone
! =utc offset
시간대를 계산하기 위해 오프셋을 사용하는 것은 잘못된 접근 방식이며 항상 문제가 발생합니다. 시간대와 일광 절약 규칙은 1 년에 여러 차례 변경 될 수 있으며 변경 사항을 따라 가기가 어렵습니다.
JavaScript로 시스템의 IANA 시간대 를 얻으려면
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
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
속성이 정의되지 않은 상태로 유지되었습니다.
나는이 답변이 약간 벗어난 주제라는 것을 알고 있지만 많은 답변을 찾고있는 사람들은 표시를 위해 시간대를 형식화하고 아마도 영역 약어를 얻길 원한다고 상상합니다. 그래서 여기에 ...
클라이언트 시간대를 멋지게 형식화하려면 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
split[4] + " " + split[5]
!
split
포함 : ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
그래서 결과는Daylight Time)
new 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))
pad(parseInt(Math.abs(offset/60)), 2)
올바르게 교체해야합니다 . 그렇지 않으면 내 경우와 같이 +5.530을 얻을 수 있습니다 ... 수학 플로어 등이 더 나은지 여부는 확실하지 않습니다. atleast 예상대로 +0530 제공
당신이 사용할 수있는:
<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
오프셋과 표준 시간대를 모두 제공하는 단일 라이너는 단순히 새 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
포맷은 구현 의존적이기 때문에, 객체; 간단한 문자열 슬라이싱 방식은 여러 엔진에서 일관된 결과를 생성하지 못할 수 있습니다.
자바 스크립트 :
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
와 moment.js :
moment().format('zz');
Z
그리고ZZ
와 momentjs현재 시간대를 다음과 같이 찾을 수 있습니다.
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>
와 dayjs현재 시간대를 다음과 같이 찾을 수 있습니다.
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 오프셋을 분 단위로 반환합니다.
getTimezoneOffset()
.
시간대 (시간)
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;
}
Date.toString()
이 신뢰할 수 없으며 MDN이 그 이유를 설명합니다. 내 답변 에서 관련 섹션을 문서에서 붙여 넣었습니다 .
이 결과 연산자가 시간대와 반대임을 확인하십시오. 따라서 일부 수학 함수를 적용한 다음 숫자를 더 적게 검증하십시오.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? 그것은해야한다 floor
, 그렇지?
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이 그 이유를 설명합니다. 내 답변 에서 관련 섹션을 문서에서 붙여 넣었습니다 .
이 시도,
new Date().toString().split("GMT")[1].split(" (")[0]
이 값은 사용자 컴퓨터에서 얻은 것이며 언제든지 중요하므로 중요하지 않다고 생각합니다. 대략적인 값을 얻은 다음 서버에서 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
온 new Date(
당신은 오프셋받을 수 있습니다), 당신이 할 수있는 시간대 이름을 얻을 수 있습니다 :
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
()
날짜 끝 사이의 값 , 즉 시간대 이름 을 얻습니다 .
Date.toString()
이 신뢰할 수 없으며 MDN이 그 이유를 설명합니다. 내 답변 에서 관련 섹션을 문서에서 붙여 넣었습니다 . 또한이 답변은 이미 적어도 3 번 주어졌습니다.
이것은 내 해결책이 될 것입니다.
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
에 대한 대안으로 new Date().getTimezoneOffset()
와moment().format('zz')
, 당신은 또한 사용할 수 있습니다momentjs:
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 )
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에서 작동
Date.toString()
이 신뢰할 수 없으며 MDN이 그 이유를 설명합니다. 내 답변 에서 관련 섹션을 문서에서 붙여 넣었습니다 .
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>