Подтвердить что ты не робот

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

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

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

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


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

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

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

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

Ответ 1

Я нашел метод, который работает с использованием PHP DateTimezone class (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 году.. кто знал?), Поэтому эта функция проверяет, есть ли смещение в будущем или нет.

Ответ 2

На самом деле метод 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 месяца (март), надеюсь, что он поможет

Ответ 3

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

Возможно, вы можете его крыло:

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

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

Ответ 4

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

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

Ответ 5

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