2009-10-19 8 views
12

En PHP, vous pouvez dire si une date donnée est au cours de la période heure avancée en utilisant quelque chose comme ceci:Comment savoir si un fuseau horaire observe l'heure d'été à n'importe quel moment de l'année?

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

Le problème est que cela ne vous indique si qu'un point dans le temps est l'heure d'été. Existe-t-il un moyen fiable de vérifier si l'heure d'été est en vigueur à tout moment dans ce fuseau horaire?


Modifier pour clarifier:

  • Brisbane, Australie n'observe pas l'heure d'été à tout moment de l'année. Toute l'année, c'est GMT + 10.
  • Sydney, Australie, d'octobre à mars quand il change de GMT + 10 à GMT + 11.

Je me demande s'il y aurait une méthode existante, ou un moyen de mettre en œuvre une méthode qui fonctionne en tant que tel:

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

Je ne comprends pas ce que vous voulez. Pourriez-vous reformuler la question d'une façon ou d'une autre? Ou peut-être donner un exemple? Je ne sais pas. –

+0

Ces aussies sont bizarres (pas vouloir vous offenser) en ce qui concerne l'heure d'été: http://www.bcl.com.au/times-daylight-saving.htm –

+0

Oui, il y a même un parti politique dont la seule politique est d'introduire l'heure d'été dans le Queensland du Sud-Est ... – nickf

Répondre

14

J'ai trouvé une méthode qui fonctionne en utilisant la classe DateTimeZone de PHP (PHP 5.2+)

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

ou, si vous utilisez PHP 5.3+

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

La fonction getTransitions() vous donne des informations sur chaque fois que le décalage change pour un fuseau horaire. Cela inclut les données historiques (Brisbane avait l'heure d'été en 1916 .. qui savait?), donc cette fonction vérifie s'il y a un changement de décalage dans le futur ou non.

0

Je ne pense pas, mais étant donné que presque tous les pays observe DST change son temps pour une saison entière ou deux, vous pourriez essayer de tester 4 points au cours d'une année donnée.

Par exemple, test date("I", $date) pour 2009/01/01, 2009/04/01, 2009/07/01 et 2009/10/01. Si ce fuseau horaire tombe en heure d'été, alors au moins une de ces dates retournera 1.

3

DateTimeZone::getTransitions pourrait aider.

Vous pourriez probablement l'aile:

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

Sinon, vous aurez besoin d'analyser les textes en fonction zoneinfo fichiers de données.

10

En fait, la méthode n'a pas nickf fonctionne pour moi si je l'ai retravaillé un peu ...

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

même appel de fonction retourne vrai en 1 mois (Mars) espère que cela aide la date

+0

Magnifique, merci –

+0

réponse parfaite, applaudissements – dlofrodloh

0

a pour être sur le fuseau horaire de l'utilisateur/serveur pour qu'il fonctionne, et vous ne pouvez pas utiliser une plage avec la date comme vous le faites avec getTransitions

Questions connexes