Это немного из моего кода 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);
Я хочу получить дату и время в «назад», но если летнее время используется, то даты отключаются на 1 час. Я не знаю, как проверить, действует ли DST или нет.
Как я могу узнать, когда летнее время начинается и заканчивается?
источник
getTimezoneOffset
возвращает обратное значение, тогдаMath.max
действительно возвращается стандартное смещение. Код правильный.Создайте две даты: одну в июне, одну в январе. Сравните их значения getTimezoneOffset ().
Теперь проверьте getTimezoneOffset () текущей даты.
источник
Этот ответ очень похож на принятый ответ, но не переопределяет
Date
прототип и использует только один вызов функции, чтобы проверить, действует ли переход на летнее время, а не два.Идея заключается в том, что, поскольку ни одна страна не соблюдает ТЛЧ, которое длится в течение 7 месяцев [1] , в области, где наблюдается летнее время, смещение от времени UTC в январе будет отличаться от июля.
В то время как летнее время перемещает часы вперед , JavaScript всегда возвращает большее значение в течение стандартного времени. Поэтому, получая минимальное смещение между январем и июлем, получим смещение часового пояса во время летнего времени.
Затем мы проверяем, равен ли часовой пояс дат этому минимальному значению. Если это так, то мы находимся в летнее время; в противном случае мы не.
Следующая функция использует этот алгоритм. Он принимает объект даты
d
и возвращает значение,true
если для этой даты действует летнее время, иfalse
если это не так:источник
Math.max(...) != d.get...()
, он вернет истину, если DST наблюдается в данном часовом поясе И дата в настоящее время в DST. Если летнее время не соблюдается или дата соответствует стандартному смещению, возвращается значение false.Я столкнулся с этой же проблемой сегодня, но, поскольку наше летнее время начинается и останавливается в разное время от США (по крайней мере, насколько я понимаю), я использовал немного другой маршрут ..
Затем вы просто сравниваете текущее смещение часового пояса с DST и nonDST, чтобы увидеть, какой из них соответствует.
источник
На основании комментария Мэтта Джохансона к решению, предоставленному Шелдоном Гриффином, я создал следующий код:
Он пытается получить лучшее из всех миров, принимая во внимание все комментарии и ранее предложенные ответы, а именно:
1) Кэширует результат за год stdTimezoneOffset, так что вам не нужно пересчитывать его при тестировании нескольких дат в одном году.
2) Он не предполагает, что летнее время (если оно вообще существует) обязательно в июле и будет работать, даже если оно будет в какой-то момент, а в каком-то месте будет в любом месяце. Однако с точки зрения производительности он будет работать быстрее, если действительно июль (или около месяца) действительно является летним временем.
3) В худшем случае он будет сравнивать getTimezoneOffset первого числа каждого месяца. [и делайте это Один раз за год тестирования].
Предположение, которое он все еще делает, состоит в том, что, если есть период DST, больше чем один месяц.
Если кто-то хочет снять это предположение, он может изменить цикл на нечто более похожее на то, что содержится в солютине, предоставленном Аароном Коулом, - но я все равно прыгнул бы на пол года вперед и вырвался из цикла, когда будут найдены два разных смещения]
источник
Библиотека moment.js предоставляет
.isDst()
метод для своих временных объектов.источник
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 часа.
Вы можете проверить это, создав дату в июле, а затем получив смещение.
Что будет печататься в журнале консоли инструментов разработчика браузера?
Ответ: 240
Итак, теперь вы можете создать дату в январе и посмотреть, что ваш браузер возвращает для смещения часового пояса для зимнего сезона.
Ответ: 300
Очевидно, 300 больше, чем 240. Итак, что это значит? Должны ли вы написать код, который проверяет, что зимнее смещение больше летнего? Или летнее смещение меньше зимнего? Если между летним и зимним смещением часового пояса есть разница, можно предположить, что для этого часового пояса используется летнее время. Но это не говорит вам, если сегодня используется DST для часового пояса браузера. Итак, вам нужно получить смещение часового пояса на сегодня.
Ответ: - Зависит от времени года
Если текущее смещение часового пояса и летнее время совпадают, и смещения часового пояса летом и зимой различны, то по логической дедукции, сегодня должно быть НЕ быть в DST.
Можете ли вы опустить сравнение смещений часового и летнего часовых поясов (чтобы узнать, используется ли DST для этого часового пояса) и просто сравнить сегодняшнее смещение часового пояса с летним смещением TZ и всегда получить правильный ответ?
Ну, сегодня зима или лето? Если бы вы знали это, вы могли бы применить следующую логику:
Но проблема в том, что вы не знаете, будет ли сегодняшняя дата зимой или летом. У каждого часового пояса могут быть свои правила запуска и остановки DST. Вам нужно будет отслеживать правила каждого часового пояса для каждого часового пояса в мире. Так что, если есть лучший и более простой способ, вы можете сделать это лучше и проще.
Что нам осталось, так это то, что вам нужно знать, использует ли этот часовой пояс летнее время, а затем сравнить текущее смещение часового пояса с летним смещением часового пояса. Это всегда даст вам надежный ответ.
Последняя логика:
Функция, чтобы определить, использует ли часовой пояс в браузере DST:
источник
Используйте Moment.js ( https://momentjs.com/ )
moment().isDST();
даст вам, если наблюдается экономия дневного света.Также он имеет вспомогательную функцию для расчета относительного времени для вас. Вам не нужно делать ручные вычисления, например
moment("20200105", "YYYYMMDD").fromNow();
источник
Вы близко, но немного не в себе. Вам никогда не нужно рассчитывать свое время, так как оно является результатом ваших собственных часов. Он может определить, используете ли вы летнее время в вашем местоположении, но не для удаленного местоположения, созданного смещением:
Это все равно будет неправильно и через час, если они находятся в летнее время. Вам нужна удаленная учетная запись времени, если они в настоящее время находятся внутри своего летнего времени или нет, и отрегулируйте соответственно. попробуйте рассчитать это и измените ваши часы на - скажем, 1/2/2015 и сбросьте часы на час назад, как если бы они находились вне летнего времени. Затем рассчитайте смещение для места, которое все еще должно отставать на 2 часа. Он покажет час впереди двухчасового окна. Вам все равно придется учесть час и отрегулировать. Я сделал это для Нью-Йорка и Денвера и всегда ошибаюсь (на час вперед) в Денвере.
источник
Я обнаружил, что с помощью Moment.js библиотеки с некоторыми из описанных здесь концепций (сравнение января и июня) работает очень хорошо.
Эта простая функция возвратит, наблюдает ли часовой пояс, в котором находится пользователь, переход на летнее время:
Простой способ убедиться в том, что это работает (в Windows), - это изменить часовой пояс на зону, отличную от DST, например, Аризона вернет false, а EST или PST вернет true.
источник
Перспективное решение, которое работает во всех часовых поясах
x
быть ожидаемое количество миллисекунд в год интереса без учета летнего времени.y
быть количество миллисекунд с начала эпохи с даты интересующей даты.z
быть количество миллисекунд с начала эпохи полной даты и времени интересаt
будет вычитание какx
иy
изz
:z - y - x
. Это дает смещение из-за летнего времени.t
ноль, то DST не действует. Еслиt
не ноль, то действует DST.Я считаю, что приведенный выше фрагмент кода превосходит все остальные ответы, размещенные здесь по многим причинам.
Однако, если вы не готовитесь к более чем 2 периодам летнего времени, то приведенный ниже код можно использовать, чтобы определить, действует ли DST как логическое значение.
источник
Недавно мне нужно было создать строку даты с UTC и DST, и, основываясь на ответе Шелдона, я соединил это:
источник
Есть ли проблема с использованием
Date.toString().indexOf('Daylight Time') > -1
"" + new Date()
"" + new Date(...)
Это кажется совместимым со всеми браузерами.
источник
"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
ES6 Стиль
источник