Zaman Dilimlerini veritabanına kaydetmek için en iyi uygulama hangisidir?


13

Veritabanındaki her bir adresimiz için zaman dilimleri toplamaya başlamak istiyoruz. Zaman dilimlerini saklamak için en iyi uygulama nedir? Mevcut adres kayıtları için zaman dilimlerini nasıl elde edersiniz?

Microsoft SQL sunucusu, .net mvc, C # kullanıyorum. Herhangi bir öneri büyük mutluluk duyacağız.



Btw normal bir zaman dilimi gotcha bir int kullanmaktır, ancak bazı zaman dilimleri + veya - 30 dakika hatta 15 dakika olabilir :) Oh ve bunun tam bir bilim, gün ışığından yararlanma tasarrufu ve böyle bir şey attığını unutmayın.
Rocklan

2
Tek yönlü @LachlanB o zaman dilimi daha bir olmasıdır koymak için yer bir daha ofset zaman . Ancak bu görüş bile tek başına yeterli değil, örneğin Rusya yakın zamanda gün ışığından yararlanma konusundaki politikalarını değiştirdi, yani gerçek tarihe bağlı olarak farklı davranmanız gerekecek.
Daniel B

Yanıtlar:


7

Sürekli değişmeyen (veya yılda iki kez) bir şey saklamak istiyorsunuz. Https://en.wikipedia.org/wiki/List_of_tz_database_time_zones saat dilimi veritabanı tam olarak doğru olanıdır. Yani sadece iki harf saklıyorsun.

Bu veritabanından zaman ofsetini ve yaz saati uygulamasının ne zaman aktif olduğunu sorgulayabilirsiniz. Sadece zaman ofseti değil, aynı zamanda size bir alan verir, aynı enlemdeki birçok yer farklı kodlara sahip olacak ve zaman dilimi kurallarını ayrı ayrı değiştirebilecek ve yazılımınız bunu işleyebilecektir.

Veritabanınızda değişiklik yapmanız gereken tek zaman, bir konumun ait olduğu saat dilimini değiştirdiği ve bu çok nadir olacağı zamandır.


Vikipedi'deki listenin tüm IANA zaman dilimleri için 2 karakterlik kısaltmalar içermediğine dikkat edin; ayrıca eşleme açık değildir. Tam tarihsel bilgilere ihtiyacınız varsa, bunun yerine tam adları girin.
Hulk

2
Wikipedia sayfasında gördüğüm tek iki harf kodu ülke kodlarıdır. Bunlar zaman dilimlerini benzersiz bir şekilde tanımlamaz. Örneğin, ABD'deki tüm saat dilimleri aynı iki harfli ülke koduna sahiptir: ABD. Benzer şekilde, tüm Avustralya genelinde AU ülke kodu vardır.
Ian

3

Mutlak en iyi uygulama, TIMESTAMP WITH TIMEZONESQL99 tarafından tanımlanan veri türünü destekleyen bir veritabanı kullanmak olacaktır .

SQL Server, gerçek zaman dilimini depolamak dışında datetimeoffsether şeyi TIMESTAMP WITH TIMEZONEyapabilen bir türe sahiptir . Yapabileceğiniz tek şey UTC'den (örn. 2013-05-04 12:34:56 -5:00) Bir uzaklık saklamaktır , yani depolamadan önce saat dilimine göre bunu belirlemeniz gerekir.


3

.Net framework 4.0 veya üstünü kullandığınızı varsayarsak, TimeZoneInfo ihtiyacınız olan şeydir.

Tüm tarih değerlerini veritabanında UTC biçiminde saklayın. Depolanan tarihleri ​​görüntüleme için yerel formata dönüştürmek üzere bir TimeZoneInfo nesnesi oluşturmak için her istemci için kimlik değerini veya ToSerializedString () sonucunu kullanın.


2

DB'nizdeki her adres için bir saat dilimi saklamak istediğinizi söylediniz, ancak onunla ne yapmak istediğinizi söylemediniz. Bir DB'de bir şey depolamak nadiren kendi başına bir amaçtır.

Her halükarda , doğrudan veya TZ'yi entegre eden raf yazılımından bazılarını kullanarak TZ veritabanını , yani Olsen veritabanını kullanmak isterim. Bir saat dilimini TZ DB girişlerinden birine , örneğin 'Afrika / Kampala' veya 'Avrupa / Paris' olarak atıfta bulunmak için dize olarak saklayabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.