Как узнать, соблюдает ли часовой пояс летнее время в любое время года?
В PHP вы можете указать, соответствует ли данная дата во время периода летнего времени, используя следующее:
$isDST = date("I", $myDate); // 1 or 0
Проблема заключается в том, что это только говорит о том, находится ли этот момент во времени в DST. Есть ли надежный способ проверить, действует ли DST в любое время в этот часовой пояс?
Изменить, чтобы уточнить:
- Брисбен, Австралия не соблюдает летнее время в любое время года. Круглый год - GMT + 10.
- Сидней, Австралия, с октября по март, когда он меняется с GMT + 10 на GMT + 11.
Мне интересно, есть ли какой-нибудь существующий метод или способ реализовать метод, который работает как таковой:
timezoneDoesDST('Australia/Brisbane'); // false
timezoneDoesDST('Australia/Sydney'); // true
Ответы
Ответ 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