В PHP вы можете указать, соответствует ли данная дата во время периода летнего времени, используя следующее:
$isDST = date("I", $myDate); // 1 or 0
Проблема в том, что это говорит только о том, находится ли этот момент в DST. Есть ли надежный способ проверить, действует ли DST в любое время в этот часовой пояс?
Изменить, чтобы уточнить:
Мне интересно, будет ли какой-нибудь существующий метод или способ реализовать метод, который работает как таковой:
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