Bir timezone yılın herhangi bir zamanında Yaz saati uygulaması nasıl anlarsınız?

5 Cevap php

Belirli bir tarih böyle bir şey kullanarak Yaz Saati döneminde ise PHP, size söyleyebilirim:

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

Sorun, bu sadece zaman o bir nokta DST olup olmadığını söyler olmasıdır. DST o zaman dilimi içinde herhangi bir vea yürürlükte olup olmadığını kontrol etmek için güvenilir bir yol var mı?


Edit to clarify:

  • Brisbane, Avustralya yılın herhangi bir zamvea gün ışığından tasarruf gözlemek değil. Tüm yıl boyunca, o GMT +10 olduğunu.
  • Sydney, GMT +10 dan GMT +11 değiştiğinde Avustralya Ekim-Mart, yapar.

Bazı mevcut yöntem veya gibi çalışan bir yöntemi uygulamak için bir yol olacağını merak ediyorum:

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

5 Cevap

Ben (PHP 5.2 +) PHP'nin DateTimeZone sınıfı kullanarak çalışan bir yöntem bulduk

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

ya da, PHP 5.3 + çalıştırıyorsanız

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

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?), bu nedenle bu fonksiyon kontrolleri gelecekte veya bir ofset bir değişiklik varsa.

Aslında nickf yöntem bu yüzden bir küçük taşınmış benim için çalışıyor vermedi ...

/**
* 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

Aynı işlev çağrı umut olur (Mart) 1 ay içinde doğru dönecektir

DateTimeZone::getTransitions yardımcı olabilir.

Muhtemelen kanat olabilir:

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

Aksi takdirde metin tabanlı zoneinfo veri dosyalarını ayrıştırmak gerekiyor ediyorum.

Ben öyle düşünmüyorum, ama DST gözlemler hemen her ülkenin bütün bir ya da iki sezon için sürekli değişir bu yana, herhangi bir yıl boyunca 4 puan test deneyebilirsiniz.

Örneğin, bir test date("I", $date) 2009/01/01, 2009/04/01, 2009/07/01 ve 2009/10/1 için. Bu timezone DST içine düşerse, o zaman bu tarihlerde en az biri 1 dönecektir.

tarih çalışması için kullanıcı / sunucu timezone olmak zorundadır, ve getTransitions ile yapmak gibi tarihi ile bir dizi kullanamazsınız