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

Вы попробовали ü (Гј) и Ü (Гњ)?

можно найти, как ввести другие буквы здесь .

12
задан Lance Roberts 21 January 2010 в 22:01
поделиться

5 ответов

I've found a method which works using PHP's DateTimezone class (PHP 5.2+)

function timezoneDoesDST($tzId) {
    $tz = new DateTimeZone($tzId);
    $trans = $tz->getTransitions();
    return ((count($trans) && $trans[count($trans) - 1]['ts'] > time()));
}

or, if you're running PHP 5.3+

function timezoneDoesDST($tzId) {
    $tz = new DateTimeZone($tzId);
    return count($tz->getTransitions(time())) > 0;
}

The getTransitions() function gives you information about each time the offset changes for a timezone. This includes historical data (Brisbane had daylight savings in 1916.. who knew?), so this function checks if there's an offset change in the future or not.

14
ответ дан 2 December 2019 в 05:41
поделиться

I don't think so, but since almost every country that observes DST changes its time for an entire season or two, you could try to test 4 points during any given year.

For example, test date("I", $date) for 2009/01/01, 2009/04/01, 2009/07/01 and 2009/10/01. If that timezone falls into DST, then at least one of those dates will return 1.

0
ответ дан 2 December 2019 в 05:41
поделиться

DateTimeZone::getTransitions might help.

You could probably wing it:

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

Otherwise you'd need to parse the text-based zoneinfo data files.

3
ответ дан 2 December 2019 в 05:41
поделиться

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

{{ 1}}
10
ответ дан 2 December 2019 в 05:41
поделиться

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

{{1} }
0
ответ дан 2 December 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: