2009-10-19 3 views
12

PHP에서, 주어진 날짜가 일광 절약 시간 기간 동안 다음과 같은 것을 사용하여 알 수 있습니다.시간대가 일광 절약 시간을 일년 중 언제라도 지키는 지 확인하는 방법은 무엇입니까?

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

문제는이 중 한 시점이 DST인지 여부만을 알려주는 것입니다. 해당 시간대의 DST가 언제든지 유효한지 확인할 수있는 확실한 방법이 있습니까?


명확하게 편집하십시오.

  • 호주 브리즈번에서는 일년 중 언제든지 일광 절약 시간을 준수하지 않습니다. 일 년 내내 GMT + 10입니다.
  • 호주 시드니는 10 월에서 3 월까지 GMT + 10에서 GMT + 11로 변경됩니다.

몇 가지 기존 메서드 또는 같은 작동하는 메서드를 구현하는 방법이있을 경우 궁금하네요 :

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

원하는 것을 이해하지 못합니다. 어떻게 든 질문을 다시 할 수 있겠습니까? 아니면 몇 가지 예를 들어 주시겠습니까? 나는 모른다. –

+0

DST와 관련하여이 오스트레일리아 사람들은 이상하게 여겨집니다. (http://www.bcl.com.au/times-daylight-saving.htm) –

+0

예, 일광 절약제를 도입하는 유일한 방침이있는 정당조차 있습니다 동남 퀸즐랜드에서 ... – nickf

답변

14

당신이 실행하는 경우 5.3+

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

getTransitions() 기능을 제공 PHP를 PHP의 DateTimezone 클래스 (PHP 5.2 이상)

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

또는를 사용하여 작동하는 방법을 발견했습니다 시간대에 대한 오프셋이 변경 될 때마다에 대한 정보. 여기에는 역사적인 데이터 (브리즈번은 1916 년 일광 절약제를 보유하고 있습니다. 누가 알았습니까?)이므로이 함수는 장래에 오프셋 변경이 있는지 확인합니다.

0

나는 그렇게 생각하지 않습니다,하지만 거의 모든 나라 이후 그 DST가 전체 시즌 또는 2 시간 동안 시간을 ​​변경하는 것을 관찰하면 주어진 한 해 동안 4 점을 테스트 할 수 있습니다.

예를 들어 2009/01/01, 2009/04/01, 2009/07/01 및 2009/10/01에 대해 date("I", $date)을 테스트하십시오. 해당 시간대가 DST에 속하면 해당 날짜 중 적어도 하나가 1을 반환합니다.

3

DateTimeZone::getTransitions 도움이 될 수 있습니다.

당신은 할 수 아마도 날개를 :

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

그렇지 않으면 당신은 텍스트 기반 zoneinfo 데이터 파일을 구문 분석해야 할 것입니다.

10

사실 nickf 방법은

+0

Wonderful, thanks –

+0

완벽한 대답, 건배 – dlofrodloh

0

날짜가 도움이되기를 바랍니다 나를 위해 작품 그래서 나는 그것을 (3 월)

/** 
* 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 개월에 true를 돌려줍니다 ... 조금 재 작업하지 않았다 사용자/서버 시간대에 있어야 작동하며 getTransitions처럼 날짜가있는 범위를 사용할 수 없습니다.

관련 문제