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

StackOverflow https://stackoverflow.com/questions/1586552

  •  22-09-2019
  •  | 
  •  

Вопрос

В 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top