Farklı zaman dilimlerinde PHP sunucusu ve MySQL sunucusu ile başa çıkmak

4 Cevap php

Sunucu barındırma (PHP) ve MySQL sunucusu farklı zaman dilimlerinde zaman GoDaddy gibi standart hosting paketleri, veya Ağ Çözümleri kullanmak bizler için, nasıl datetime dönüşümleri ele?

Ayrıca, herkes sitenize ne zaman dilimi bir ziyaretçi ve uygun bir datetime değişken manipüle olduğunu belirlemek için bazı iyi uygulama tavsiyesi var mı?

4 Cevap

PHP gibi bir komut dosyası içerisindeki tüm tarih / zaman işlevleri tarafından kullanılan öntanımlı zaman dilimini ayarlamak için date_default_timezone_set() işlevini kullanabilirsiniz 5.1.0.

(MySQL Server Time Zone Support sayfasından alıntı) MySQL için

MySQL 4.1.3 önce, sunucu yalnızca başlangıçta belirlenen sistem zaman diliminde çalışır. MySQL 4.1.3 ile başlayarak, sunucu zamanında değiştirilebilir bazıları, birkaç zaman dilimi ayarlarını korur.

Size ilgi Eğer komut başında kullanacağınız zaman dilimleri bağlantı başına bir ayardır,

SET timezone = 'Europe/London';

Istemci saat dilimi ayarını tespit için olduğu gibi, bir tanımlama için bu bilgileri almak ve kaydetmek için JavaScript biraz kullanabilirsiniz, ve uygun zaman dilimini hesaplamak için, okur sonraki sayfada kullanabilirsiniz.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes.
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset);

Yoksa onların zaman dilimleri kendilerini ayarlamak için kullanıcılara chioce sunabilir.

UTC gibi her şeyi saklayın. Istemci ayarlarını kullanarak istemci düzeyinde, ya da sunucu tarafında dönüşümleri yapabilirsiniz.

php - date

mysql - utc-timestamp

Željko Zivkoviç gelen cevap RE, 'Europe / London' gibi timezone tanımlayıcıları sadece mySQL yönetici sisteme dilimi tabloları ekledi eğer çalışmak ve onları güncel tutar.

Aksi takdirde 'gibi -4:00' sayısal uzaklıklar sınırlıdır. Neyse php date ('P') biçimi (5.1.3 gibi) bunu sağlar

Yani bir uygulama yapılandırma dosyasında diyelim ki aklınıza gelebilecek

define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
    date_default_timezone_set(TZ);
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}

Bu PHP ve MySQL kullanmak ofset ne timezone kabul anlamına gelir.

Always use TIMESTAMP for storing time values. Sütun aslında UNIX_TIME (dönemi) olarak depolanır, ancak dolaylı olarak okuduğumda yazılı zaman ofset ve güncel time_zone dönüştürülür.

Siz) sonra yerine bir küresel (define, diğer zaman dilimleri kullanıcılar için kez görüntülemek istiyorsanız, yukarıda kendilerine verilen zaman dilimini ayarlayın. TIMESTAMP değerleri otomatik app sonuç kümesini gördüğü zaman mySQL tarafından çevrilecektir (aslında olayın orijinal dilimini bilmek gerekiyorsa, bazen bir sorun olabilir, çok sonra başka bir sütun olması gerekir)

ve kadar, gibi, size tarihleri ​​karşılaştırmak ve doğrulamak için yeteneğini kaybetmek yok "neden sadece int yıllardan gibi tüm süreleri depolamak değil", ve always app düzeyde tarih temsiline dönüştürmek (ve var demektir doğrudan verilere bakarken gözleri sert - 1254369600 olanlardan, hızlı)

Ben nedeniyle önce dateTime türü ile sorunları vardı sahip bir bigint olarak bütün tarihleri ​​kaydetmek. Ben şimdi onlar aynı zaman dilimi içinde olarak saymak, içine zaman () PHP fonksiyonu sonucu kaydetmek :)