Как определить, наблюдает ли часовой пояс дневного света в любое время года?
Вопрос
В 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
Один и тот же вызов функции вернется через 1 месяц (март), надеюсь, это поможет
DateTimezone :: getTransitions может помочь.
Вы, вероятно, могли бы получить это:
$hasDst = date("I", strtotime('June 1')) !== date("I", strtotime('Jan 1'));
В противном случае вам нужно проанализировать текстовый ZoneInfo Дата файлы.
Я так не думаю, но, поскольку почти каждая страна, которая наблюдает, что DST меняет свое время на весь сезон или два, вы можете попытаться протестировать 4 очка в течение любого данного года.
Например, тест date("I", $date)
за 2009.01.01, 2009/04/01, 2009/07/01 и 2009/10/01. Если этот часовой застрой попадает в DST, то, по крайней мере, одна из этих дат вернется 1.
Дата должна быть на часовом поясе пользователя/сервера, чтобы он работал, и вы не можете использовать диапазон с датой, как и с GetTransitions