PHP, Codeigniter: küresel bir web uygulaması, kullanıcıların timezone / yere göre Tarih / Saat Nasıl Kurulur?

7 Cevap php

Ben MySQL veritabanı için belirli bir kaydı eklerseniz ben sadece fark var - bu sunucu bir tarih / zaman ve tarihe göre arama fonksiyonu yararsız olduğu anlamına gelir bulunur belirli bir kullanıcı değil, olacak! Onlar bunu sunucuları timezone eklendi ziyade onların zaman dilimi içinde ilave olduğunda göre aramak mümkün olmayacak gibi.

Kullanıcıların yere (belki kendi IP kullanarak) ve kullanıcıların dilimi kullanılır ben () veya zaman (tarih aramak her zaman) belirli bir süre ve belirli tarih global olarak Codeigniter bir yolu var mı.

What I am actually asking for is probably how to make my application dependent on each users timezone?

Belki onun daha iyi profilindeki her kullanıcıları dilimini depolamak ve standart bir zaman (sunucular zamanı) ve sonra her kullanıcı için için zaman dönüştürmek için?

Tüm teşekkürler

7 Cevap

Ben kolay yolu dahili veri depolama için bir zaman dilimini tanımlamak (sunucunuzun zaman dilimi veya UTC) ve çıktısı alınırken kullanıcının zaman dilimine göre zaman dönüştürmek olduğunu düşünüyorum.

Ben doğru işlevlerine işaret edemez yüzden CodeIgniter'ı bilmiyorum. Timezone farkında olan bir önemli kütüphane Zend_Date olduğunu: Working with Timezones Ben bu işlevleri ile çalıştı değil henüz ama umut verici görünüyor.

Eğer kullanıcının zaman dilimi biliyorum Ancak, bir kez birlikte tarih ve / veya saat çıktısı zaman offset substracts / ekler kendi işlevi koymak zor değil.

Muhtemelen ilgili bir soru:

Ne yapmanız gerekir (GMT çağrılacak kullanılır) UTC zaman olarak sisteminizde tarih ve zamanlarda tüm saklamak gibi geliyor. Bu dünyada her şey ayarlamaları ile kapalı hesaplanmış olduğu taban zamanıdır. (Örn: Central Time -6 saat UTC kapalı)

Sunucu ve DB doğru zamanlarda ve zaman dilimi ayarları ile yapılandırılmış olarak MySQL sürece geçerli UTC saati almak için UTC_TIMESTAMP () kullanabilirsiniz.

PHP (kodunuzda bu çalışacak şekilde her sayfada ya da merkezi bir indeks dosyasına koymak) UTC PHP damgası ayarlamak için bu çalıştırın:

date_default_timezone_set('UTC');

Yoksa PHP.INI içine doğrudan gitmek ve küresel UTC zaman kullanmak için bunu söyleyebilirim. PHP tek bir kurulum üzerinde birden fazla web sitesi varsa (bu çalışmayabilir.

Ve sonra herhangi bir sistemde size sadece arayabilirsiniz geçerli UTC zaman almak gerekir:

time();

Eğer defa bu kullanıcı için ayar yapmak görüntülemek Sonra sistemde her kullanıcı için daha sonra da yaşamak ne timezone onlara sormak gerekir ve edecektir. 5 saat = 12:00 - 17:00 UTC o ve ben (-5) Paskalya ABD'de yaşayan Yani zamanı 05:00 olacaktır.

Bu hakkı almak için uzun bir süreç olabilir ama bunu bir kez kullanıcılar, özellikle uluslararası çok kullanışlı bulacaksınız.

Eğer saat önce (sizin bakış itibaren) oldu bir şey, bakmak gerekir eğer ben bu sunucu üzerinde normalize zaman verir beri kullanıcının zaman hesaplamaya, daha iyi bir seçenek olduğunu düşünüyorum, yani, sizinle bir karışıklık olmaz Amerika, Asya ve örneğin avustralya zaman.

Sadece kendi timezone için isteyin (genellikle bu zaman dilimi içinde büyük şehirler ile seçin) ve ardından tekrar hesapla :)

Lütfen karşılaştırma ve göstermek için biri için bir, böylece serverside çok hesaplamalar olmaz - ya da alternatif olarak, two timedates saklayabilirsiniz.

Hesaplamaya Ayrıca, eğer, tarih yardımcısı kullanabilirsiniz: http://codeigniter.com/user_guide/helpers/date_helper.html

WordPress ve phpBB gibi varolan web uygulamasının bir örneği ele alalım. Her kullanıcı kendi saat dilimi ayarını var.

In When receiving a content from the user, use local_to_gmt() function Date Helper sonra gmt tarihini kullanarak veritabanına içeriği kaydedebilirsiniz. Veri getiriliyor zaman GMT zaman alacak. Kullanıcının saat dilimi ayarını olsun, o zaman diliminde verileri görüntüleyebilir.

Bu şekilde, iki zaman dilimi arasında hesaplama kendinizi kaydedebilirsiniz. Sadece sunucunun zaman doğru bir ortamda olduğunu, böylece tüm verileri doğru gmt zaman içinde olduğundan emin olun.

GÜNCELLEME:

Son zamanlarda ben buna sahip timezone konuda emeği geçen projeyi gözden. Çeşitli senaryo düşündükten sonra, burada zaman dilimi sorunu için çözüm:

  1. All data stored right now already using server's time. Changing this will takes times and prone to error, so I leave it like that.
  2. For the new data from user that set the content date to a certain date and time, I stored it into 2 column. First column is to store the data as is, and used to displaying it as is. Second column will be a recalculation of the date based on the user's timezone into server's timezone. This column is used in the WHERE statement (filter based on server date) and for the ORDER (because this column's value all in same timezone, which is the server's timezone).

Bu şekilde, sadece sunucu tarihini içine kullanıcı tarih dönüştürmek için 1 timezone hesaplama yapmak. Görüntülemek için, ben sunucunun datetime göre tarihini gösterir. Aynı zaman dilimi içinde depolanan tüm veriler bu yana, veri sunucu tarih değerini tutun sütun tarafından sipariş edilebilir.

Kendi dilimini belirledik kullanıcı için, veritabanından tarih kolayca kullanıcının saat diliminde datetime almak için yeniden hesaplanır. Btw, benim uygulamada, ben timeago jquery plugins kullanarak tarihini gösterir. Bu eklentileri ISO8601 biçiminde (UTC zaman) zaman gerekiyor. CodeIgniter'daki local_to_gmt() function bunu yapmak için de kullanılabilir.

Açıkçası İngiliz Yaz Saati (Yaz Saati) için sıçrama programlama dünyasında büyük bir karışıklık olduğunu, ve ben gerçekten bu karışıklık yakalandım.

Bir saat dilimi duyarlı bir sistem kullanırken (Ben tutarlı anlatmaya çalışacağım olan) bulabileceğiniz en iyi çözüm şudur:

  • Web Server ve Database ikisi aynı makine timezone kapalı çalıştırıyor olmalıdır. Bu timezone dönüşümlerin yapı taşları olarak ben UTC öneririz. Bu veritabanında saklanan tüm tarihleri ​​sürekli olmasını sağlayacaktır ve bu Yaz Saati arasındaki 1saat atlama gibi herhangi bir kez atlamak yok.
  • PHP komut tüm üstündeki kullanıcının belirli zaman dilimi ile date_default_timezone_set('Europe/London'); kullanın.
  • When producing dates from user submitted forms, use gmmktime(); oluşturuldu damgası UTC ve ayarladığınız saat dilimine göre değişmiş değil emin olmak için.
  • Tarihleri ​​görüntülerken bu hesaba ayarladığınız saat dilimini alarak doğru zamana damgası dönüştürmek gibi date();, kullanılabilmektedir.
  • If you do need to show a date in the UTC format then use gmdate(); ile $gm_timestamp Eğer gmmktime();. ile veritabanından alınan veya oluşturduğunuz

Ben durumu anlamak yardımcı olmak için PHP'nin bu biraz yazdım.

date_default_timezone_set('UTC');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';

date_default_timezone_set('Europe/London');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';

Umarım iyi bir iş yaptık, ama hala kafamda sorunu savaş çalışıyorum çünkü ben şüpheliyim.

UPDATE:

Ben şimdi kullanıcı girilen tarihleri ​​hakkında şüpheler yaşıyorum çünkü ben yaptım sevindim.

Veritabanında UTC ilgili tarih ile maç (dikkate onların dilimini alarak) Kullanıcı girilen tarihi almak için, bunu aracılığıyla koymak gerekir mktime(). Ve sonra gmdate('U', $timestamp); gerçek UTC zaman damgası almak için kullanabilirsiniz. (Bence)

Example

Bir raporlama taraftan bakarak, kullanıcı 'Europe / Londra' dilimini kullanıyor. Bizim PHP script başında biz Veritabanı ederken, date_default_timezone_set('Europe/London'); çağrı (ve içindeki tüm kayıtları) UTC hala.

Kullanıcı daha sonra da 30/03/2010 14:00 25/03/2010 10:00 arasında veritabanına eklenen kitapların listesini seçmek istiyorum yoluyla gönderir. PHP komut dosyası daha sonra doğru bir UTC zaman damgası oluşturmak için mktime($hour, $minute, $second, $month, $day, $year) ile tarih değişkenleri çalışır. Başlangıç ​​tarihi değişmeyecek, ancak PHP bitiş tarihi BST timezone içinde olduğunu bilir, buna göre UTC zaman damgası değiştirir.

Sonuç kullanıcıya geri iade edildiğinde, date('r', $date_added) kullanıcıya kitabın kendi set timezone göre veritabanına eklenen tarihini göstermek için kullanılabilir.

Bu değişiklikleri Bu bağlantı anlayışı ile yardımcı olabilir. http://www.daylightsavingtime.co.uk/

Codeigniter tarih işlevleri her şekilde ilgilenen bir yardımcı içerir.

Codeigniter Date helper

komutu gmt_to_local () üçüncü parametre 'daylight_saving' için ... size yardımcı olacaktır.

Takes a Unix timestamp (referenced to GMT) as input, and converts it to a localized timestamp based on the timezone and Daylight Saving time submitted. Example:
$timestamp = '1140153693';
$timezone = 'UM8';
$daylight_saving = TRUE;

echo gmt_to_local($timestamp, $timezone, $daylight_saving);