Как узнать, соблюдает ли часовой пояс летнее время в любое время года?

В PHP вы можете указать, соответствует ли данная дата во время периода летнего времени, используя следующее:

$isDST = date("I", $myDate); // 1 or 0 

Проблема в том, что это говорит только о том, находится ли этот момент в DST. Есть ли надежный способ проверить, действует ли DST в любое время в этот часовой пояс?


Изменить, чтобы уточнить:

  • Брисбен, Австралия не соблюдает летнее время в любое время года. Круглый год – GMT + 10.
  • Сидней, Австралия, с октября по март, когда он меняется с GMT + 10 до GMT + 11.

Мне интересно, будет ли какой-нибудь существующий метод или способ реализовать метод, который работает как таковой:

 timezoneDoesDST('Australia/Brisbane'); // false timezoneDoesDST('Australia/Sydney'); // true 

Я нашел метод, который работает с использованием класса DateTimezone PHP (PHP 5.2+)

 function timezoneDoesDST($tzId) { $tz = new DateTimeZone($tzId); $trans = $tz->getTransitions(); return ((count($trans) && $trans[count($trans) - 1]['ts'] > time())); } 

или, если вы используете PHP 5.3+

 function timezoneDoesDST($tzId) { $tz = new DateTimeZone($tzId); return count($tz->getTransitions(time())) > 0; } 

Функция getTransitions() предоставляет вам информацию о каждом изменении времени смещения для часового пояса. Это включает в себя исторические данные (Брисбен имел летние сбережения в 1916 году .. кто знал?) , Поэтому эта функция проверяет, есть ли смещение в будущем или нет.

На самом деле метод nickf не работал для меня, поэтому я немного переработал его …

 /** * Finds wherever a TZ is experimenting dst or not * @author hertzel Armengol <emudojo @ gmail.com> * @params string TimeZone -> US/Pacific for example * */ function timezoneExhibitsDST($tzId) { $tz = new DateTimeZone($tzId); $date = new DateTime("now",$tz); $trans = $tz->getTransitions(); foreach ($trans as $k => $t) if ($t["ts"] > $date->format('U')) { return $trans[$k-1]['isdst']; } } // Usage var_dump(timezoneExhibitsDST("US/Pacific")); --> prints false var_dump(timezoneExhibitsDST("Europe/London")); --> prints false var_dump(timezoneExhibitsDST("America/Chicago")); --> prints false 

тот же вызов функции вернет true в течение 1 месяца (март), надеюсь, что это поможет

DateTimeZone :: getTransitions может помочь.

Вы, вероятно,

 $hasDst = date("I", strtotime('June 1')) !== date("I", strtotime('Jan 1')); 

В противном случае вам потребуется проанализировать текстовые файлы данных zoneinfo .

Я так не думаю, но так как почти каждая страна, которая наблюдает за ДСТ, меняет свое время на весь сезон или два, вы можете попробовать протестировать 4 очка за любой год.

Например, date("I", $date) испытания date("I", $date) на 2009/01/01, 2009/04/01, 2009/07/01 и 2009/10/01. Если этот часовой пояс попадает в DST, то по крайней мере одна из этих дат вернется 1.

дата должна быть в пользовательском / серверном часовом поясе, чтобы она работала, и вы не можете использовать диапазон с датой, как это делается с getTransitions