getTimezoneOffset()
Метод в JavaScript, в браузере, возвращает количество минут смещенных от 00:00 часового пояса. Например, часовой пояс America / New_York в Daylight Savings (DST) возвращает число 300. 300 минут - это 5-часовая разница от нуля. 300 минут, разделенные на 60 минут - это 5 часов. Каждый часовой пояс сравнивается с нулевым часовым поясом, +00: 00 / Etc / GMT / время по Гринвичу.
MDN Web Docs
Следующее, что вы должны знать, это то, что смещение имеет противоположный знак фактического часового пояса.
Информация о часовых поясах поддерживается Управлением по присвоению номеров в Интернете (iana)
часовые пояса Яны
Красиво отформатированная таблица часовых поясов предоставлена joda.org
часовые пояса
+00: 00 или Etc / GMT - время по Гринвичу
Все часовые пояса смещены от +00: 00 / «Etc / GMT» / время по Гринвичу
Летнее время всегда более раннее, чем «обычное» время летом. Вы устанавливаете свои часы назад в осенний сезон. (Лозунг «Отступить», чтобы вспомнить, что делать)
Так, в Америке / Нью-Йорке время в летнее время (зима) на один час раньше обычного времени. Так, например, то, что обычно было в 5 часов вечера в Нью-Йорке летом, сейчас в 4 часа дня по Америке / Нью-Йорк в летнее время. Название времени "America / New_York" является именем часового пояса "Long Format". Восточное побережье США обычно называет часовой пояс Восточное стандартное время (EST).
Если вы хотите сравнить текущее смещение часового пояса с смещением часового пояса какой-либо другой даты, вам необходимо знать, что математический знак (+/- «Положительный / Отрицательный») смещения часового пояса является противоположностью часового пояса.
Посмотрите на таблицу часовых поясов на joda.org и найдите часовой пояс для "America / New_York". Он будет иметь отрицательный знак перед стандартным смещением.
Земля вращается против часовой стрелки вокруг своей оси. Человек, наблюдающий восход солнца в Гринвиче, видит восход солнца за 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 для часового пояса браузера. Итак, вам нужно получить смещение часового пояса на сегодня.
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. Вам нужно будет отслеживать правила каждого часового пояса для каждого часового пояса в мире. Так что, если есть лучший и более простой способ, вы можете сделать это лучше и проще.
Что нам осталось, так это то, что вам нужно знать, использует ли этот часовой пояс летнее время, а затем сравнить текущее смещение часового пояса с летним смещением часового пояса. Это всегда даст вам надежный ответ.
Последняя логика:
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
действительно возвращается стандартное смещение. Код правильный.