2011-03-06 3 views
7

나는 시간대가 drop down box 인 Codeigniters timezone_menu을 사용하며, PHP로이 시간대를 어떻게 활용할 것인지 궁금합니다 date_default_timezone_set?Codeigniter, timezone_menu 및 date_default_timezone_set

codeigniters timezone의 예로는 UP1입니다. 그러나, 당신은 문자열로 PHPs date_default_timezone_set으로 그것을 사용할 수 없습니다이 질문은 Europe/Berlin

과 같이해야에 소요에 의해 허용 될 수있는 PHP의 하나에 CodeIgniter의 시간대 문자열로 변환하는 방법은 무엇입니까 date_default_timezone_set?

+1

그들이 원하는 상황에서 아무 소용이없는 경우 CodeIgniter의 날짜 도우미 값의 세트를 제공 않는 이유 질문입니다 ? – Ash

+0

문서에 따르면 Codeigniter는'date_default_timezone_set()'을 설정하지 않을 것을 제안합니다. 그리고 그것은 정확하게 나의 문제입니다. PHP의 원시 날짜 함수 또는 Codeigniter 중에서 선택하는 것이 더 좋습니다.나는 내 결정을 내리고있다. (Codeigniter를 지금까지 사용했다.) –

답변

2

timezones()을 사용하여 U(M|P)x 값 중 하나의 UTC 오프셋을 가져올 수 있습니다.

$offset = timezones('UP1'); // don't know the exact format returned but should be something like 1 or '+01:00' 

이 시점부터, 나는 오프셋과 PHP 시간대 사이의 맞춤 매핑의 유일한 방법이라고 생각합니다. Etc/GMT(+|-)x 시간대를 사용할 수는 있지만 문제는 DST 전환 정보가 포함되지 않는다는 것입니다.

일반적으로 문제는 UTC 오프셋이 많은 다른 시간대에 실제로 매핑된다는 것입니다. UP1 ((UTC + 1시) 베를린, 브뤼셀, 코펜하겐, 마드리드, 파리, 로마)는 예를 들어 Europe/Berlin, Europe/Brussels, Europe/Copenhagen, Europe/Madrid, Europe/Paris, Europe/Rome뿐만 아니라에 Africa/Luanda에 매핑됩니다. 이제는 이러한 시간대 중 일부에서 발생할 수있는 DST 전환으로 인해 임의로 복잡해집니다.

DST가 필요하지 않은 경우 timezones() 함수와 Etc/GMT(+|-)x 시간대의 반환 값 사이의 매핑은 OK 여야합니다. 그렇지 않으면 매핑이 모호하지 않아서 Codeigniter 시간대 처리를 전혀 사용할 수 없습니다. 나를 위해

+0

스테판! 그것은 나에게 차례로 아이디어를 준다. 나는'timezone_name_from_abbr'을 사용할 수 있다고 생각합니다. 또한 DST를 지원합니다! 나는 이것이 올바른 사용이라고 생각한다.'timezone_name_from_abbr ('', $ offset * 3600, true)'- 어떻게 생각하니? – Abs

+0

'timezone_name_from_abbr()'함수는 지금까지는 몰랐지만 실행 가능한 해결책 인 것 같습니다. –

7

다음 작품 :

// Example - timezones is part of the date helper function 
// You obviously wouldn't echo it out, you would pass it in to 
// set default timezone function in PHP based on the posted data from 
// the dropdown 
echo timezone_by_offset(timezones('UM5')); // ouputs 'America/Porto_Acre' which is (-5) 

// And the function 
function timezone_by_offset($offset) { 
    $offset = ($offset+1) * 60 * 60; 
    $abbrarray = timezone_abbreviations_list(); 

    foreach ($abbrarray as $abbr) { 
     foreach ($abbr as $city) { 
      if ($city['offset'] == $offset) { 
       echo($city['timezone_id']); 
       return true; 
      } 
     } 
    } 
    echo "UTC"; 
    return false; 
} 

편집 원래 기능은 DST 오프셋을 배제하지 않았다. timezone_abbreviations_list()는 DST가 true로 표시된 시간대의 2x를 나열합니다. 예를 들어 Tasmania는 +11 및 +10 아래에 나타납니다. 따라서 DST == TRUE이면 반환 목록의 일부로 무시하십시오.

//-- Function ------------------------------------------------------------------- 
function timezone_by_offset($offset) { 
    $abbrarray = timezone_abbreviations_list(); 
    $offset = $offset * 60 * 60; 

    foreach ($abbrarray as $abbr) { 
     foreach ($abbr as $city) { 
      if ($city['offset'] == $offset && $city['dst'] == FALSE) { 
       return $city['timezone_id'];         
      } 
     } 
    } 
    return 'UTC'; // any default value you wish 
} 

몇 가지 예 :

//-- Test Cases ------------------------------------------------------------------- 
echo timezone_by_offset(-12) . '<br/>'; 
echo (date_default_timezone_set(timezone_by_offset(-12)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// Etc/GMT+12 
// Valid 

echo timezone_by_offset(-10) . '<br/>'; 
echo (date_default_timezone_set(timezone_by_offset(-10)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// America/Anchorage 
// Valid 

echo timezone_by_offset(-8) . '<br/>'; 
echo (date_default_timezone_set(timezone_by_offset(-8)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// Etc/GMT+8 
// Valid   

echo timezone_by_offset(6) . '<br/>'; 
echo (date_default_timezone_set(timezone_by_offset(6)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// Asia/Aqtobe 
// Valid   

echo timezone_by_offset(7) . '<br/>'; 
echo (date_default_timezone_set(timezone_by_offset(7)) == TRUE ? 'Valid' : 'Not Valid'). '<br/>'; 
// Indian/Christmas 
// Valid 
+0

좋은 기능 - 작동하는 것처럼 보입니다. 기본적으로 처음부터 1 ~ $ 오프셋을 더하는 이유는 무엇입니까? – Abs

+0

나는 언급 했어야했다. 나는 수동으로 일광의 차이를 입력했다. DST = 1 인 경우 +1 * 60^2는 $ 도시 오프셋과 비교되어야합니다. 필요한 경우 함수를 다른 대답으로 다시 작성할 수 있습니다. – Chris

+1

@Chirs - DST를 어떻게 처리하는지 알고 싶습니다. 함수에 DST를 전달해야하거나 수동으로'timezone_abbreviations_list'에 의해 해결 될 수 있습니까? – Abs

0

CodeIgniter를 다시 시간대 참조를 제공, 시간대와 함께 사용할 수 있습니다() 시간은 diff를 얻기 위해 자신의에서 당신은 시간을 계산할 수 있습니다.

0

당신은 예를 들어 gmt_to_local() 함수에서 오프셋 시간대의 값을 사용할 수 있습니다 :

//set the time offset based on the users timezone settings 
$timezone = 'UM7'; 

$offset = timezones($timezone); 
$servertime = time(); 

$mytime = gmt_to_local($servertime,$offset); 

$time = date("M d, Y h:i A", $mytime); 

//example result 
//Dec 22, 2011 04:18 PM