이것은 이것이 필요한 내 JS 코드입니다.
var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);
“ago”로 날짜 시간을 가져오고 싶지만 DST를 사용중인 경우 날짜가 1 시간 늦습니다. DST가 유효한지 확인하는 방법을 모르겠습니다.
일광 절약 시간 제가 시작되고 끝나는시기를 어떻게 알 수 있습니까?
답변
이 코드는 표준 시간 대 일광 절약 시간 (DST) 동안 더 큰 값 을 getTimezoneOffset
반환하는 사실을 사용합니다 . 따라서 표준 시간 동안의 예상 출력을 결정하고 주어진 날짜의 출력이 동일한 지 (표준) 또는 이하 (DST)인지 비교합니다.
참고 getTimezoneOffset
반환 긍정적 인 영역에 대한 분의 숫자 서쪽 일반적으로 명시되어 UTC의, 음의 시간 (그들이있는 거 UTC “뒤에”이후). 예를 들어 로스 앤젤레스는 UTC-8h 표준, UTC-7h DST입니다. getTimezoneOffset
가 480
아닌 12 월 (겨울, 표준시)에 (양수 480 분)을 반환합니다 -480
. 동반구의 경우 음수 를 리턴합니다 (예 -600
: 겨울철 시드니에서는 “앞서”( UTC + 10h ) 임에도 불구하고 ).
Date.prototype.stdTimezoneOffset = function () {
var jan = new Date(this.getFullYear(), 0, 1);
var jul = new Date(this.getFullYear(), 6, 1);
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}
Date.prototype.isDstObserved = function () {
return this.getTimezoneOffset() < this.stdTimezoneOffset();
}
var today = new Date();
if (today.isDstObserved()) {
alert ("Daylight saving time!");
}
답변
6 월과 1 월의 두 날짜를 만듭니다. getTimezoneOffset () 값을 비교하십시오.
- 1 월 오프셋> 6 월 오프셋 인 경우 클라이언트는 북반구에 있습니다
- 1 월 오프셋 <6 월 오프셋 인 경우 클라이언트는 남반구에 있습니다
- 차이가 없으면 클라이언트 시간대는 DST를 준수하지 않습니다.
이제 현재 날짜의 getTimezoneOffset ()을 확인하십시오.
- 북반구 인 6 월과 같으면 현재 시간대는 DST (+1 시간)입니다.
- 남반구 1 월과 같으면 현재 시간대는 DST (+1 시간)입니다.
답변
이 답변은 허용되는 답변과 매우 유사하지만 Date
프로토 타입을 재정의하지는 않으며 하나의 함수 호출 만 사용하여 일광 절약 시간이 2 개가 아닌 유효한지 확인합니다.
아이디어는 7 개월 동안 지속되는 DST를 관찰하는 국가가 없기 때문에 [1] DST를 관찰하는 지역에서는 1 월 UTC 시간으로부터의 오프셋이 7 월의 오프셋과 다를 것입니다.
일광 절약 시간 제가 시계를 앞으로 이동하는 동안 JavaScript는 항상 표준 시간 동안 더 큰 값을 . 따라서 1 월과 7 월 사이의 최소 오프셋을 얻는 것은 DST 중에 시간대 오프셋을 가져옵니다.
그런 다음 날짜 시간대가 해당 최소값과 같은지 확인합니다. 그렇다면 DST에 있습니다. 그렇지 않으면 우리는 그렇지 않습니다.
다음 함수는이 알고리즘을 사용합니다. 이 날짜 객체, 소요 d
, 반환을 true
일광 절약 시간이 해당 날짜에 유효한 경우와 false
그렇지 않은 경우 :
function isDST(d) {
let jan = new Date(d.getFullYear(), 0, 1).getTimezoneOffset();
let jul = new Date(d.getFullYear(), 6, 1).getTimezoneOffset();
return Math.max(jan, jul) != d.getTimezoneOffset();
}
답변
나는 오늘도 같은 문제에 직면했지만 일광 절약은 미국과는 다른 시간에 시작하고 멈춘 이후 (적어도 나의 이해에서) 약간 다른 경로를 사용했습니다.
var arr = [];
for (var i = 0; i < 365; i++) {
var d = new Date();
d.setDate(i);
newoffset = d.getTimezoneOffset();
arr.push(newoffset);
}
DST = Math.min.apply(null, arr);
nonDST = Math.max.apply(null, arr);
그런 다음 현재 시간대 오프셋을 DST 및 비 DST와 비교하여 어떤 것이 일치하는지 확인하십시오.
답변
Sheldon Griffin이 제공 한 솔루션에 대한 Matt Johanson의 의견을 바탕으로 다음 코드를 작성했습니다.
Date.prototype.stdTimezoneOffset = function() {
var fy=this.getFullYear();
if (!Date.prototype.stdTimezoneOffset.cache.hasOwnProperty(fy)) {
var maxOffset = new Date(fy, 0, 1).getTimezoneOffset();
var monthsTestOrder=[6,7,5,8,4,9,3,10,2,11,1];
for(var mi=0;mi<12;mi++) {
var offset=new Date(fy, monthsTestOrder[mi], 1).getTimezoneOffset();
if (offset!=maxOffset) {
maxOffset=Math.max(maxOffset,offset);
break;
}
}
Date.prototype.stdTimezoneOffset.cache[fy]=maxOffset;
}
return Date.prototype.stdTimezoneOffset.cache[fy];
};
Date.prototype.stdTimezoneOffset.cache={};
Date.prototype.isDST = function() {
return this.getTimezoneOffset() < this.stdTimezoneOffset();
};
모든 의견과 이전에 제안 된 답변과 구체적으로 고려하여 모든 세계 최고를 얻으려고합니다.
1) 연간 stdTimezoneOffset에 대한 결과를 캐시하여 같은 연도에 여러 날짜를 테스트 할 때 다시 계산할 필요가 없습니다.
2) DST (존재하는 경우)가 반드시 7 월이라고 가정하지 않으며 어떤 시점에서 어떤 장소가 어떤 달이든 상관없이 작동합니다. 그러나 성능 측면에서 실제로 7 월 (또는 몇 개월)이 실제로 DST이면 더 빠르게 작동합니다.
3) 최악의 경우 매월 첫 번째의 getTimezoneOffset을 비교합니다. [시험 연도 당 1 회].
DST 기간이있는 경우 한 달보다 큰 것으로 가정합니다.
만약 누군가 그 가정을 제거하고 싶다면 Aaron Cole이 제공하는 용질의 것과 비슷한 것으로 루프를 바꿀 수 있습니다.하지만 반년이 더 걸렸고 두 개의 다른 오프셋이 발견되면 루프에서 벗어날 것입니다.]
답변
moment.js의 라이브러리가 제공하는 .isDst()
그 시간 객체에 대한 방법을.
moment # isDST는 현재 순간이 일광 절약 시간인지 확인합니다.
moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST
답변
getTimezoneOffset()
자바 스크립트의 방법은, 브라우저에서, 00:00 시간대 오프셋 (분)을 반환합니다. 예를 들어 일광 절약 시간제 (DST)의 America / New_York 시간대는 숫자 300을 반환합니다. 300 분은 0에서 5 시간의 차이입니다. 300 분을 60 분으로 나눈 값은 5 시간입니다. 모든 시간대는 0 시간대 +00 : 00 / 기타 / GMT / 그리니치 시간과 비교됩니다.
다음으로 알아야 할 것은 오프셋에 실제 시간대의 반대 부호가 있다는 것입니다.
표준 시간대에 대한 정보는 인터넷 할당 번호 기관 (iana)에서 관리합니다.
멋진 형식의 시간대 표는 joda.org에서 제공합니다.
+00 : 00 또는 기타 / GMT는 그리니치 시간입니다
모든 시간대는 +00 : 00 / “Etc / GMT”/ 그리니치 시간에서 오프셋됩니다.
일광 절약 시간은 항상 여름의 “일반”시간보다 빠릅니다. 가을 시즌에 시계를 다시 설정합니다. (무엇을해야하는지 기억하기위한 “폴백”슬로건)
따라서 일광 절약 시간제 (겨울)의 America / New_York 시간은 정규 시간 1 시간 전입니다. 예를 들어, 여름에 뉴욕시에서 오후 5시 (일반적으로 오후 5시)는 일광 절약 시간으로 오후 4시 (미국 / 뉴욕)입니다. “America / New_York”시간은 “Long Format”시간대 이름입니다. 미국 동부 해안은 일반적으로 시간대를 동부 표준시 (EST)라고합니다.
오늘 시간대 오프셋을 다른 날짜의 시간대 오프셋과 비교하려면 시간대 오프셋의 수학 부호 (+/- “양수 / 음수”)가 시간대와 반대라는 것을 알아야합니다.
joda.org의 시간대 표를보고 “America / New_York”의 시간대를 찾으십시오. 표준 오프셋 앞에 음의 부호가 있습니다.
지구는 축의 시계 반대 방향으로 회전합니다. 그리니치에서 일출을 보는 사람은 뉴욕시의 누군가가 일출을 볼 수 있기 5 시간 전에 일출을 봅니다. 미국 서해안의 누군가가 일출을 본 후 미국 동부 해안의 누군가가 일출을 볼 수 있습니다.
이 모든 것을 알아야하는 이유가 있습니다. 따라서 연중 다른 시간대에 모든 시간대를 테스트 할 필요없이 일부 JavaScript 코드가 DST 상태를 올바르게 가져 오는지 여부를 논리적으로 확인할 수 있습니다.
뉴욕시에서 11 월에 시계가 한 시간 뒤로 설정되었다고 상상해보십시오. 뉴욕시의 여름에는 오프셋이 240 분 또는 4 시간입니다.
7 월에 날짜를 만든 다음 오프셋을 가져 와서이를 테스트 할 수 있습니다.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
브라우저의 개발자 도구 콘솔 로그에 무엇을 인쇄합니까?
답은 : 240
이제 1 월에 날짜를 만들고 겨울철 시간대 오프셋에 대해 브라우저가 반환하는 내용을 확인할 수 있습니다.
var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
답은 : 300
분명히 300은 240보다 큽니다. 이것이 무엇을 의미합니까? 겨울 오프셋이 여름 오프셋보다 큰지 테스트하는 코드를 작성해야합니까? 아니면 여름 오프셋이 겨울 오프셋보다 작습니까? 여름 시간대와 겨울 시간대 오프셋이 다른 경우이 시간대에 DST가 사용되고 있다고 가정 할 수 있습니다. 그러나 오늘날 브라우저 시간대에 DST를 사용하고 있는지 여부 는 알 수 없습니다 . 따라서 오늘의 시간대 오프셋을 가져와야합니다.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
답은? -시간에 따라 다름
오늘의 시간대 오프셋 및 오프셋 여름 시간대가 동일 경우 와 여름과 겨울 시간대 오프셋은 논리적 추론에 의해 다음, 다른, 오늘 DST에 있지해야합니다.
여름 및 겨울 시간대 오프셋 비교 (이 시간대에 DST가 사용되는지 알기 위해)를 생략하고 오늘 시간대 오프셋을 여름 TZ 오프셋과 비교하고 항상 정답을 얻을 수 있습니까?
today's TZ Offset !== Summer TZ Offset
오늘 겨울이나 여름에 있습니까? 알고 있다면 다음 논리를 적용 할 수 있습니다.
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
그러나 문제는 오늘 날짜가 겨울인지 여름인지 알 수 없다는 것입니다. 모든 표준 시간대에는 DST가 시작 및 중지되는시기에 대한 자체 규칙이있을 수 있습니다. 세계의 모든 시간대에 대한 모든 시간대 규칙을 추적해야합니다. 따라서 더 좋고 쉬운 방법이 있다면 더 좋고 쉬운 방법도 있습니다.
우리가 남긴 것은이 표준 시간대가 DST를 사용하는지 알고 오늘의 표준 시간대 오프셋과 서머 표준 시간대 오프셋을 비교해야한다는 것입니다. 그것은 항상 당신에게 신뢰할만한 대답을 줄 것입니다.
최종 논리는 다음과 같습니다.
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
브라우저의 시간대가 DST를 사용하는지 판별하는 기능 :
function is_DST_Used_In_This_TimeZone() {
var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet
offsetsNotEqual, thisYear, today;
today = new Date();//Create a date object that is now
thisYear = today.getFullYear();//Get the year as a number
Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
July_Date = new Date(thisYear, 6, 1);
july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal
console.log('offsetsNotEqual: ' + offsetsNotEqual);
return offsetsNotEqual;//If the offsets are not equal for summer and
//winter then the only possible reason is that DST is used for
//this time zone
}
