Ben benim amaçlar için çözdüm. (Üzgünüm, bu notlar ayrıntılı, onlar başka bir şey olarak benim gelecekteki sevk kadar konum) öğrendiklerimi özetlemek olacak.
Ben önceki yorum, DATETIME ve TIMESTAMP alanlarından birinde söylediklerini aksine do farklı davranır. Biçim ve UTC zaman için geçerli saatle onu dönüştürmek DAMGASI alanlar (docs göstermek gibi) ": mm ss YYYY-AA-GG SS" bunları göndermek ne olursa olsun almak. Eğer veri almak her ters şeffaf olur. DATETIME alanları bu dönüşümü yapmazlar. Onlar bunları göndermek ne olursa olsun almak ve sadece doğrudan saklayın.
Neither the DATETIME nor the TIMESTAMP field types can accurately store data in a timezone that observes DST. Eğer "2009-11-01 01:30:00" saklarsanız alanları istediğini 01:30 hangi sürümünü ayırmak için bir yol var - -04:00 veya -05:00 sürümü.
Tamam, bu yüzden (örneğin UTC gibi) olmayan bir DST zaman dilimi bizim veri depolamak gerekir. TIMESTAMP alanlar ben açıklayacağım nedenlerle doğru bu verileri işlemek edemiyoruz: Sisteminiz bir DST zaman dilimine ayarlı ise o zaman ne TIMESTAMP koymak geri çıkmak ne olmayabilir. Bunu zaten UTC dönüştürülür ettik veri göndermek bile, yine yerel saat diliminde veri bulunuyor üstlenecek ve UTC henüz başka bir dönüşüm yapacağız. Yerel saat dilimi DST gözlemlediği zaman bu DAMGASI zorlanan yerel-to-UTC-back-to-yerel gidiş dönüş (2 farklı olası kere "2009-11-01 01:30:00" haritalar beri) kayıplı.
DateTime ile istediğiniz herhangi bir zaman dilimi içinde veri depolamak ve sen (siz DAMGASI alanların size yutturmak kayıplı gidiş dönüş dönüşümleri zorla alamadım) ne gönderirseniz geri alırsınız emin olabilirsiniz. Yani çözüm DATETIME alanını kullanın ve before saving to the field (I UTC muhtemelen en iyi seçenek olduğunu düşünüyorum) sen onu kaydetmek istediğiniz ne olursa olsun olmayan DST bölge içine sistem zaman dilimi dönüştürmektir. Bu açıkça 01:30 "2009-11-01 01:30:00 -04:00" arasında UTC eşdeğer tasarruf ya da "" 2009-11-01 böylece kendi betik dili haline dönüştürme mantığı oluşturmanıza olanak verir: 00 -05:00 ".
Unutulmaması gereken bir diğer önemli şey, bir DST TZ tarihleri saklıyorsanız MySQL tarih / saati matematik fonksiyonları DST sınırları etrafında düzgün çalışmaz kalmamasıdır. Yani UTC kurtarmak için tüm neden daha.
Özetle ben şimdi bunu:
When retrieving the data from the database:
Açıkça doğru bir Unix zaman damgası almak için MySQL dışında UTC olarak veritabanından verileri yorumlamak. Bunun için PHP'nin strtotime () işlevi veya DateTime sınıfını kullanın. CONVERT_TZ çıkışı, sadece bir ': mm: YYYY-AA-GG ss ss' olacaktır, çünkü güvenilir MySQL'in CONVERT_TZ () veya UNIX_TIMESTAMP () işlevleri kullanılarak MySQL içinde yapılamaz belirsizlik sorunlardan muzdarip değer ve UNIX_TIMESTAMP () varsayar onun giriş sistemi timezone değil, veri ASLINDA (UTC) depolanan dilimi bulunmaktadır.
When storing the data to the database:
MySQL dışında arzu kesin UTC zaman tarih dönüştürün. Örneğin: PHP'nin DateTime sınıfının ile UTC dönüştürmek, sonra belirgin "2009-11-01 01:30:00 EEST" dan "2009-11-01 01:30:00 EST" belirlemek ve doğru UTC zamandan tasarruf edebilirsiniz Lütfen DATETIME alana.
Vay. Teşekkürler herkesin girdi ve yardım için çok. Umarım bu başkası yolda bazı baş ağrısı kaydeder.
BTW, MySQL 5.0.22 ve 5.0.27 bu görüyorum