The getTimezoneOffset()
Метод в JavaScript, в браузері, повертає кількість хвилин зміщених від 00:00 часового поясу. Наприклад, часовий пояс America / New_York в режимі літнього часу (DST) повертає число 300. 300 хвилин - це 5 годин різниці від нуля. 300 хвилин ділиться на 60 хвилин - це 5 годин. Кожен часовий пояс порівнюється з нульовим часовим поясом +00: 00 / Etc / GMT / Greenwich time.
Веб-документи MDN
Наступне, що ви повинні знати, - це те, що зміщення має протилежний знак фактичного часового поясу.
Інформація про часові пояси підтримується Інтернетом, що призначає номер (iana)
часові пояси iana
Приємно відформатовану таблицю часових поясів надає joda.org
Часові пояси часу joda
+00: 00 або Etc / GMT - час за Грінвічем
Усі часові пояси зміщені з +00: 00 / "Etc / GMT" / Грінвічський час
Перехід на літній час завжди є більш раннім, ніж "звичайний" час влітку. Ви встановлюєте годинник ще в осінній сезон. (Гасло "Падіння назад", щоб пам'ятати, що робити)
Так, час в Америці / Нью-Йорку в режимі літнього часу (взимку) за годину до звичайного часу. Так, наприклад, те, що зазвичай було влітку в 17:00 в Нью-Йорку влітку, зараз 16:00 в Америці / Нью-Йорку в режимі літнього часу. Назва "America / New_York" time - назва часового поясу "Long Format". Східне узбережжя США зазвичай називає їх часовий пояс Східним стандартним часом (EST)
Якщо ви хочете порівняти сьогоднішнє зміщення часового поясу зі зміщенням часового поясу на якусь іншу дату, вам потрібно знати, що математичний знак (+/- "Позитивний / Негативний") зміщення часового поясу протилежний часовому поясу.
Подивіться на таблицю часового поясу на joda.org і знайдіть часовий пояс для "Америка / Нью-Йорк". Він матиме негативний знак перед стандартним зміщенням.
Земля обертається проти годинникової стрілки на своїй осі. Людина, яка спостерігає схід сонця в Ґрінвічі, бачить схід за 5 годин до того, як хтось із Нью-Йорка побачить схід сонця. І хтось на Західному узбережжі США побачить схід сонця після того, як хтось на Східному узбережжі США побачить схід сонця.
Є причина, чому вам потрібно все це знати. Так що ви зможете логічно визначити, чи отримує якийсь код JavaScript статус DST правильно чи ні, без необхідності перевіряти кожен часовий пояс у різний час року.
Уявіть, що в Нью-Йорку - листопад, а годинник був встановлений на годину. Влітку в Нью-Йорку компенсування становить 240 хвилин або 4 години.
Ви можете перевірити це, створивши дату, яка є в липні, а потім отримати компенсацію.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
Що буде надруковано в журнал консолі розробника браузера?
Відповідь: 240
Отже, тепер ви можете створити дату в січні та побачити, що ваш браузер повертає за зміщення часового поясу на зимовий сезон.
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
}
getTimezoneOffset
повертає обернене значення, тоMath.max
справді повертає стандартне зміщення. Код правильний.