Maalesef bunun için hızlı bir düzeltme yok. Bir uygulamanın uluslararasılaştırılması, tarih / saat karşılaştırmaları ve çıktı formatlama da dahil olmak üzere birçok farklı alanın çekirdeğine gittiği için ilk tasarım tartışmalarının bir parçası olmalıdır.
Her neyse, Doğru Yapmanın izini sürmek için, saat dilimi bilgilerini zamanla birlikte depolamak çok önemlidir . Başka bir deyişle, tarih / saatin (a) saat diliminin o zamanki UTC ofsetini (not 1) dahil olmak üzere (a) ya da (b) bu değerleri yerleştiren tüm mantıkların belirli bir sabit ofsete dönüştürülmesini sağlayarak (b) olmadan anlamsız20130407 14:50
olduğunu anlamak büyük olasılıkla 0). Bunlardan hiçbiri olmadan, verilen iki zaman değeri karşılaştırılamaz ve veriler bozulmuştur . (Sonuncusu bu arada ateşle oynuyor (not 2) , bu arada; bunu yapma.)
SQL Server 2008+ 'de, datetimeoffset
veri türünü kullanarak ofseti zamanla doğrudan saklayabilirsiniz . (2005 yılında ve öncesinde tamamlama için, geçerli UTC ofset değerini saklamak için ikinci bir sütun eklerdim (dakika cinsinden).)
Bu, masaüstü tipi bir uygulama için kolaylaştırır, çünkü bu platformlar normalde bir tarih / saat + saat dilimini yerel bir saate otomatik olarak dönüştürme ve daha sonra hepsi bölgesel ayarları temel alarak çıktı için formatlama mekanizmalarına sahiptir.
Doğal olarak bağlantısı kesilmiş bir mimari olan web için, arka uç verileri düzgün bir şekilde ayarlanmış olsa bile, daha karmaşıktır, çünkü müşteriyi dönüştürme ve / veya biçimlendirmeyi yapabilmek için bilgiye ihtiyacınız vardır. Bu genellikle kullanıcı tercihi ayarları (uygulama çıktıdan önce işleri dönüştürür / biçimlendirir) veya sadece herkes için (Stack Exchange platformunun şu anda yaptığı gibi) aynı sabit format ve saat dilimi uzaklığına sahip olanları göstererek yapılır.
Arka uç verilerinin doğru bir şekilde kurulmadığını, çok hızlı bir şekilde karmaşık ve rahatsız edici hale geleceğini görebilirsiniz. Bu yollardan hiçbirine gitmenizi tavsiye etmem çünkü satır sonunda daha fazla sorunla karşılaşacaksınız.
Not 1:
Bir saat diliminin UTC kayması sabit değil: bir bölgenin UTC kaymasının bir saat artı ya da eksi değiştiği gün ışığından yararlanma koşullarını göz önünde bulundurun. Ayrıca bölgelerin günışığı tasarruf tarihleri düzenli olarak değişmektedir. Kullanarak Yani datetimeoffset
(veya kompozit local time
ve UTC offset at that time
) maksimum bilgi kurtarma sonuçlanır.
Not 2:
Veri girişlerini kontrol etmekle ilgili. Gelen değerleri doğrulamanın güvenilir bir yolu olmasa da, hesaplamaları içermeyen basit bir standardın uygulanması daha iyidir. Genel bir API ofset içeren bir veri türü beklerse, bu gereksinim arayan kişiye açık olacaktır.
Öyle olmadıysa, arayan kişi belgelere güvenmek zorundadır (eğer okursa) veya hesaplama yanlış yapılır, vs. vb., Özellikle dağıtılmış bir sistem için mahsup talep edildiğinde daha az hata / hata modu vardır ( ve hatta burada olduğu gibi ayrı sunucularda sadece web / veritabanı).
Dengelemeyi yine de saklamak iki taşı bir taşla öldürür; gerektiriyordu olmasa bile ve şimdi , bu gerekirse daha sonra olasılık kullanılabilir hale getirir. Doğru, daha fazla depolama alanı kaplıyor, ancak bence takas etmeye değer çünkü bence ilk etapta kaydedilmemişse veriler kayboluyor.