2011-03-06 14 views
7
ben Codeigniters timezone_menu kullanımı yapmak

?Codeigniter, timezone_menu ve date_default_timezone_set

Codeigniters saat dilimi örneği UP1'dur. Ancak, dize olarak PHPs date_default_timezone_set ile kullanamazsın o soru Europe/Berlin

gibi bir şey olmalıdır alır, kabul edilebilir bir PHP birine CodeIgniter saat dilimi dize dönüştürmek için bir yol yoktur date_default_timezone_set?

+1

amaçlanan bağlamda daha kullanmayacağınız CodeIgniter'ın tarih yardımcı değerlerinin bu seti sağlıyor niçin soru ? – Ash

+0

Dokümana göre, Codeigniter 'date_default_timezone_set()' ayarlamayı önermez. Ve bu tam olarak benim problemim. Ben php'nin yerel tarih işlevleri veya Codeigniter arasında seçim yapmak daha iyi olduğunu düşünüyorum.Kararımı alıyorum (Codeigniter'in şimdiye kadar kullandım) –

cevap

2

timezones() kullanarak U(M|P)x - değerlerinden biri için UTC ofsetini alabilirsiniz. Bu noktadan sonra

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

, tek yolun ofset ve PHP diliminin arasına özel eşlemesi çeşit olduğunu düşünüyorum. Etc/GMT(+|-)x zaman dilimlerini kullanabilirsiniz, ancak bunların sorunu herhangi bir DST geçiş bilgisi içermemesidir.

Genel olarak sorun, UTC-ofsetlerinin aslında birçok farklı saat dilimi ile eşleşmesidir, örn. UP1 ((UTC + 01:00) Berlin, Brüksel, Kopenhag, Madrid, Paris, Roma) örneğin Europe/Berlin, Europe/Brussels, Europe/Copenhagen, Europe/Madrid, Europe/Paris, Europe/Rome ama aynı zamanda Africa/Luanda eşleştiren. Şu anda bu zaman dilimlerinin bazılarında meydana gelebilecek DST geçişleri nedeniyle, bu durum keyfi olarak karmaşıklaşmaktadır. haritalama kesin olmadığı için

DST-şey gerekmiyorsa, timezones() fonksiyonun dönüş değeri ve Etc/GMT(+|-)x saat dilimleri arasında bir eşleme Tamam olmalıdır, aksi takdirde hiç Codeigniter zaman dilimi işleme kullanamaz. Benim için

+0

Bu mükemmel bir fikir Stefan! Bana sırayla bir fikir veriyor. Sanırım daha sonra "timezone_name_from_abbr" işlevini kullanabilirim. Ayrıca DST için destek var! Sanırım bu doğru kullanım olabilir 'timezone_name_from_abbr (' ', $ offset * 3600, true) '- Ne düşünüyorsun - benim için çalışıyor gibi görünüyor? – Abs

+0

Şimdiye kadar 'timezone_name_from_abbr()' işlevini bilmiyordum, ancak bu geçerli bir çözüm gibi görünüyor. –

7

aşağıdaki çalışır:

// 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; 
} 

DÜZENLEME orijinal fonksiyonu DST uzaklıklar dışlamadı. timezone_abbreviations_list(), DST'nin true olarak işaretlenmiş bir zaman dilimi için 2x, örneğin Tasmania, +11 ve +10'un altında görünür. Yani DST == TRUE ise, iade listesinin bir parçası olarak görmezden gelin.

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

Bazı örnekler:

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

İyi işlev - işe yarıyor gibi görünüyor, neden başlangıçta varsayılan olarak 1 ile $ arasında dengeleniyorsunuz? – Abs

+0

Bahsetmeliydim, gün ışığı farkını elle giriyordum. +1 * 60^2, DST = 1 ise $ city ofset değerinde olmalıdır. Eğer gerekirse, başka bir cevap olarak fonksiyonu yeniden yazabilirim. – Chris

+1

@Chirs - DST'yi nasıl kullanacağınızı görmek isterdim. DST'yi fonksiyona aktarmak zorunda kalacağım manuel bir şey mi yoksa bir şekilde 'timezone_abbreviations_list' tarafından çalışılabilir mi? – Abs

0

Codeigniter geri zaman dilimi referans verir, saat dilimleri ile kullanılabilir() zaman diff almak ve onların arasından size zaman hesaplayabilirsiniz.

0

Örneğin gmt_to_local() fonksiyonunda saat dilimi farkı değerini kullanabilirsiniz:

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