SORU
29 EKİM 2009, PERŞEMBE


MySQL datetime alanları ve gün ışığı tasarruf zamanı nasıl "ekstra" başvuru yapıyorum; saat?

Amerika/New York zaman dilimini kullanıyorum. Sonbaharda biz "geri" bir saat etkili "" gecenin 2'sinde saat. kazanıyor güz Geçiş noktasında şunlar olur:

01:59:00 -04:00 bu< / ^ br . sonra 1 dakika sonra olur:< / ^ br . 01:00:00-05:00

Eğer öyleyse sadece say "1:30" veya 1:30 civarında rulo ilk kez bahsediyorsunuz olup olmadığını ya da ikinci olarak belirsiz. Bir MySQL veritabanı için zamanlama verileri kurtarmaya çalışıyorum ve bu kez doğru olarak kaydetmek için nasıl belirleyemez.

Sorun şu:< / ^ br . "2009-11-01 00:30:00" Dahili 2009-11-01 00:30:00 -04:00 olarak depolanır< / ^ br . "2009-11-01 01:30:00" içten 2009-11-01 01:30:00 olarak saklanır-05:00

Bu güzel ve oldukça bekleniyor. Ama nasıl 01:30:00 için bir şey kaydedebilirim-04:00? documentation uzaklık ve buna göre, usulüne uygun olarak dikkate alınmaz oldu ofset belirten denedim belirtirken için herhangi bir destek göstermiyor.

Düşündüm tek çözüm Yaz Saati ve benim komut gerekli dönüşümler (bunun için PHP kullanıyorum) kullanmayan bir zaman dilimi için sunucu ayarı içerir. Ama gerekli olması gerektiği gibi görünmüyor.

Herhangi bir öneriniz için teşekkür ederiz.

CEVAP
30 EKİM 2009, Cuma


Benim amaçlar için olayı çözdüm. (Üzgünüm, bu notları, ayrıntılı; benim gelecekteki sevk başka bir şey için olduğu kadar onlar ne öğrendiğimi özetleyeyim.

Önceki yorumlarım, tarih ve zaman DAMGASI alanları "dedim," ne aykırıyapınfarklı davranır. Zaman DAMGASI alanları, dokümanlar belirtmek gibi), "YYYY-MM-DD hh:mm:ss" biçim ve UTC saati bulunduğunuz zaman dilimine dönüştürebilirsiniz. bunları göndermek varsa alın Ters veri almak zaman şeffaf olur. DATETİME alanları bu dönüşüm yapmayın. Onları göndermek ve doğrudan mağaza ne varsa alıyorlar.

Ne zaman DAMGASI alan tipi DATETİME doğru DST gözlemlediği bir zaman dilimi içinde veri depolayabilir. Eğer "alanları -04:00 -05:00 sürüm -- istedin. hangi ayırt etmek için bir yolu var" 2009-11-01 01:30:00 saklıyorsanız

DST olmayan bir zaman dilimi içinde bizim veri depolamak zorundayız Tamam, bu yüzden (UTC). Eğer sistem zaman DAMGASI koymak ne geri çıkmak ne olabilir o zaman DST saat dilimi için ayarlanır. zaman DAMGASI alanları açıklayacağım doğru bir sebep için bu verileri işlemek için açılamıyor: Eğer zaten UTC dönüştürülür olduğunuz veri göndermek bile, hala verileri yerel saat ve UTC için başka bir dönüşüm yapmak üstlenecek. Bu zaman DAMGASI zorlanan yerel-UTC-arkası-yerel gidiş dönüş. kayıplı zaman senin yerel saat gözlemler DST (beri "2009-11-01 01:30:00" Haritalar için 2 farklı Olası defa).

DATETİME kaydedebilir, verilerinizi herhangi bir zaman dilimi istiyorum ve emin ol ki alacaksın geri ne varsa gönder (anlamıyorsun zorla içine kayıplı gidiş dönüş dönüştürmeleri zaman DAMGASI alanları yutturmak üzerinde). Çözüm DATETİME alanı kullanmak vealan kaydetmeden öncesistem saati olmayan DST bunu kaydetmek istediğiniz bölge (muhtemelen en iyi seçenek UTC bence) her neyse alanına dönüştürmek. Bu oluşturmak için dönüşüm mantığı içine betik dili, böylece açıkça Kaydet UTC eşdeğer "2009-11-01 01:30:00 -04:00" ya ""2009-11-01 01:30:00 -05:00".

Unutulmaması gereken bir diğer önemli şey zaman matematik fonksiyonları/MySQL tarih DST TZ senin tarihleri saklıyorsanız düzgün DST sınırları geçici bir çözüm bulmak yok. Çok daha UTC kaydetmek için bir sebep.

Kısacası ben şimdi bunu:

Veritabanından veri alınırken

Doğru bir Unix zaman damgası almak için açıkça MySQL veritabanı dışındaki UTC verileri yorumlamak. PHP strtotime kullanıyorum() işlevi veya bunun için DateTime sınıfının. Bu olamaz güvenilir bir şekilde yapılması içinde MySQL kullanarak MySQL CONVERT_TZ() veya UNİX_TİMESTAMP() işlevleri nedeniyle CONVERT_TZ tek çıkış 'YYYY-aa-GG hh:mm:ss' değeri düşer belirsizlik sorunları ve UNİX_TİMESTAMP() varsayar onun giriş sistemi zaman dilimi, dilimi verileri ASLINDA saklı (UTC).

Veritabanı: verileri saklarken

MySQL dışında sizin arzu kesin UTC zaman için tarih dönüştürmek. Örneğin: PHP DateTime sınıfı belirtebilirsiniz "2009-11-01 1:30:00 EST" kesinlikle "2009-11-01 1:30:00 mesai bitiminden sonra dönüştürmek için UTC ve kaydedin doğru UTC zaman DATETİME alan.

Vay be. Teşekkürler, herkesin giriş ve yardım için çok fazla. Umarım bu yolda başka birinin bazı baş ağrısı kaydeder.

BTW, bu MySQL 5.0.22 ve 5.0.27 görüyorum

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfoPuppet

    InfoPuppet

    15 Kasım 2011
  • Showtime

    Showtime

    21 HAZİRAN 2006
  • Chaîne de TheMoustic

    Chaîne de T

    5 Kasım 2006