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');
로 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 오프셋을 분 단위로 반환합니다.
시간대-
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과 반대임을 확인하십시오. 그래서 일부 수학 함수를 적용한 다음 숫자를 적거나 더 검증하십시오.
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.
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 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 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
'programing tip' 카테고리의 다른 글
Bash 스크립트에서 사용자에게 확인을 요청하는 방법은 무엇입니까? (0) | 2020.10.04 |
---|---|
JavaScript에서 정확히 두 개의 소수로 숫자 서식 지정 (0) | 2020.10.04 |
OutputStream을 문자열로 가져 오기 (0) | 2020.10.04 |
라벨 요소 안에 입력 요소를 넣어야합니까? (0) | 2020.10.04 |
자바 스크립트 클로저 vs. 익명 함수 (0) | 2020.10.04 |