Cotonti 0.9.11, zaman dilimlerini ele almak için yeni bir yol sunuyor. Geçmişte, kullanıcılar profillerinde GMT'den saat dilimi ofsetini ayarlayabiliyordu, yani Orta Avrupa'da yaşayan kullanıcılar saat dilimlerini GMT + 1 olarak ayarlayabiliyordu.
Cotonti 0.9.11'de uygulanan yeni zaman dilimi sistemi artık bir zaman dilimi ofsetini değil, bir zaman dilimi tanımlayıcısını saklamaktadır. Zaman dilimi tanımlayıcısı, bir kıta ve bir şehirden oluşan bir dizedir ve PHP tarafından desteklenen zaman dilimlerinden biri olabilir. Bu, profilinizde GMT+1 gibi bir zaman dilimi ofseti ayarlamak yerine, Avrupa/Amsterdam gibi daha spesifik bir zaman dilimi ayarlayacağınız anlamına gelir.
Zaman dilimi uzaklıklarından zaman dilimi tanımlayıcılarına geçişin nedeni Yaz Saati Uygulaması (DST) desteğidir.
Geçmişte, Cotonti her zaman bir kullanıcının profilindeki saat dilimi ofsetine göre saatleri gösteriyordu ve bu da DST sırasında yanlış saatlere neden oluyordu. Saatler yaz aylarında bir saat geri kalıyordu.
Yeni sistemle birlikte Cotonti, DST'nin yürürlükte olması durumunda saatleri otomatik olarak ayarlayacaktır.
DST'nin başladığı ve bittiği tarihler ülkeler ve zaman dilimleri arasında farklılık gösterdiğinden, DST uygulanıp uygulanmayacağını belirlemenin tek güvenilir yolu, sunucu işletim sistemi tarafından sağlanan zaman dilimi geçişlerinin (DST değişiklikleri) dahili veritabanını kullanan PHP'nin yerleşik zaman dilimi işlevlerini kullanmaktır.
Cotonti kurulumunuzu Siena 0.9.11'e yükseltirken, cot_users veritabanı tablonuzun yeni saat dilimi sistemini karşılayacak şekilde değiştirildiğini fark edebilirsiniz. Eski zaman dilimi ofseti, kullanıcının ülkesine bağlı olarak otomatik olarak bir zaman dilimi tanımlayıcısına dönüştürülür.
Örneğin, GMT+1 saat dilimi ofsetine ve 'nl' (Hollanda) ülke koduna sahip bir kullanıcı Avrupa/Amsterdam saat dilimi tanımlayıcısına taşınacaktır. Öte yandan, aynı zaman dilimi ofsetine sahip Almanya'dan ('de') bir kullanıcı Avrupa/Berlin'e taşınacaktır.
Ülke ve ofset eşleşmezse, saat dilimi GMT olarak ayarlanacaktır. Bir saat dilimi ofseti veya ülke ayarlamamış olan kullanıcılar da varsayılan olduğu için GMT'ye geçirilecektir.
Yeni saat dilimi sistemi, profilinizde yeni bir saat dilimi seçenekleri listesiyle birlikte geliyor. Aynı GMT ofsetine sahip birçok saat dilimi olduğundan, liste çok daha uzundur.
Anlaşılır olması için, zaman dilimi tanımlayıcısının başına GMT ofseti (DST olmadan) eklenir. Örneğin, Amsterdam için seçenek "GMT+01:00 Avrupa/Amsterdam" gibi görünür.
Geliştiriciler için, yeni saat dilimi sistemi birkaç yardımcı fonksiyon sunar. İşte bir genel bakış:
cot_selectbox_timezone($chosen, $name, $add_gmt = true, $dst = false, $attrs = '', $custom_rc = '')
Saat dilimi seçim açılır menüsünü döndürür. Forms API’nin bir parçasıdır.
Örnek: cot_selectbox_timezone('GMT', 'rtimezone') =>
1 2 3 4 5 |
<select name="rtimezone"> <option value="GMT" selected="selected">GMT</option> <option value="Pacific/Apia">GMT-11:00 Pacific/Apia</option> ... </select> |
cot_build_timezone($offset, $withgmt = true, $short = false)
ISO 8601 formatında saat dilimi ofsetini döndürür.
Örnek: cot_build_timezone(3600) =>
1 |
GMT+01:00 |
cot_timezone_list($withgmt = false, $dst = false)
GMT ofsetine göre sıralanmış saat dilimi listesini döndürür.
Örnek: cot_timezone_list() =>
1 2 3 4 5 6 7 8 9 10 11 12 13 |
array ( array ( 'name' => "Pacific/Apia" , 'offset' => -39600, 'description' => "GMT-11:00 Pacific/Apia" ), array ( 'name' => "Pacific/Midway" , 'offset' => -39600, 'description' => "GMT-11:00 Pacific/Midway" ), ... ) |
cot_timezone_offset($tz, $hours = false, $dst = true)
Saat diliminin GMT’ye göre ofsetini saniye veya saat cinsinden döndürür. Yaz saati uygulaması (DST) dahil edilebilir ya da hariç tutulabilir.
Örnek: cot_timezone_offset("Europe/Amsterdam") =>
3600
(kış) veya 7200
(yaz)
cot_timezone_search($countrycode = '', $gmtoffset = null)
Belirli bir ülke kodu ve/veya GMT ofsetine göre olası saat dilimlerini döndürür.
Örnek: cot_timezone_search("ru", 14400) =>
1 2 3 4 5 |
array ( "Europe/Moscow" , "Europe/Samara" , "Europe/Volgograd" ) |
cot_timezone_transitions($tz)
Belirli bir saat dilimindeki önceki, mevcut ve sonraki geçişleri döndürür. Yaz saati uygulamasının (DST) etkin olup olmadığını belirlemek için faydalıdır.
Örnek: cot_timezone_transitions("Europe/Amsterdam") =>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
array ( 'previous' => array ( 'ts' => 1319936400, 'time' => "2011-10-30T01:00:00+0000" , 'offset' => 3600, 'isdst' => false, 'abbr' => "CET" ), 'current' => array ( 'ts' => 1332637200, 'time' => "2012-03-25T01:00:00+0000" , 'offset' => 7200, 'isdst' => true, 'abbr' => "CEST" ), 'next' => array ( 'ts' => 1351386000, 'time' => "2012-10-28T01:00:00+0000" , 'offset' => 3600, 'isdst' => false, 'abbr' => "CET" ) ) |