Jaka jest najlepsza praktyka zapisywania stref czasowych w bazie danych?

13

Chcemy zacząć zbierać strefy czasowe dla każdego z naszych adresów w bazie danych. Jaka jest najlepsza praktyka do przechowywania stref czasowych? Jak zabrałbyś się do uzyskiwania stref czasowych dla istniejących rekordów adresów?

Korzystam z serwera Microsoft SQL, .net mvc, C #. Wszelkie sugestie będą mile widziane.

Rodney
źródło
Btw normalną strefą czasową jest używanie int, ale niektóre strefy czasowe mogą wynosić + lub - 30 minut, a nawet 15 minut :) Aha i pamiętaj, że to nie jest ścisła nauka, oszczędność światła dziennego i takie mogą cię zrzucić.
Rocklan
2
@LachlanB jednym ze sposobów jest to, że strefa czasowa jest bardziej lokalizacją niż przesunięciem czasowym . Ale nawet ten pogląd sam w sobie nie wystarcza, np. Rosja niedawno zmieniła swoją politykę dotyczącą oszczędności czasu, co oznacza, że ​​będziesz musiał potraktować to inaczej w zależności od faktycznej daty.
Daniel B

Odpowiedzi:

7

Chcesz przechowywać coś, co nie zmienia się cały czas (lub dwa razy w roku). Baza danych stref czasowych https://en.wikipedia.org/wiki/List_of_tz_database_time_zones jest dokładnie właściwa. Więc przechowujesz tylko dwie litery.

Z tej bazy danych można zapytać o przesunięcie czasowe oraz kiedy aktywny jest czas letni. To nie tylko przesunięcie czasowe, ale także obszar, więc wiele miejsc na tej samej szerokości geograficznej będzie miało różne kody i może indywidualnie zmieniać reguły stref czasowych, a twoje oprogramowanie będzie w stanie to obsłużyć.

Jedynym momentem, kiedy trzeba wprowadzić zmiany w bazie danych, jest zmiana lokalizacji, do której strefy czasowej należy, co byłoby bardzo rzadkie.

gnasher729
źródło
Zauważ, że lista na Wikipedii nie zawiera 2-znakowych skrótów dla wszystkich stref czasowych IANA - a ponadto mapowanie nie jest jednoznaczne. Jeśli potrzebujesz pełnych informacji historycznych, przejdź do pełnych nazwisk.
Hulk
2
Jedyne dwuliterowe kody, które widzę na stronie Wikipedii, to kody krajów. Nie definiują one jednoznacznie stref czasowych. Na przykład wszystkie strefy czasowe w USA mają ten sam dwuliterowy kod kraju: US. Podobnie w całej Australii obowiązuje kod kraju AU.
Ian
3

Absolutną najlepszą praktyką byłoby użycie bazy danych, która obsługuje TIMESTAMP WITH TIMEZONEtyp danych zdefiniowany przez SQL99.

SQL Server ma typ o nazwie, datetimeoffsetktóry robi wszystko, co TIMESTAMP WITH TIMEZONEmoże zrobić oprócz przechowywania rzeczywistej strefy czasowej. Wszystko, co możesz zrobić, to zapisać przesunięcie względem UTC (np. 2013-05-04 12:34:56 -5:00), Co oznacza, że ​​będziesz musiał ustalić to przed przechowywaniem na podstawie strefy czasowej.

Blrfl
źródło
3

Zakładając, że używasz .Net Framework 4.0 lub nowszego, TimeZoneInfo jest tym, czego potrzebujesz.

Przechowuj wszystkie wartości dat w bazie danych w formacie UTC. Użyj wartości ID lub wyniku ToSerializedString () dla każdego klienta, aby utworzyć obiekt TimeZoneInfo do konwersji przechowywanych dat na format lokalny w celu wyświetlenia.

Wędrowny
źródło
2

Powiedziałeś, że chcesz zapisać strefę czasową dla każdego adresu w DB, ale nie powiedziałeś, co chcesz z tym zrobić. Przechowywanie czegoś w bazie danych rzadko jest celem samym w sobie.

W każdym razie chciałbym skorzystać z bazy danych TZ , czyli bazy danych Olsen, bezpośrednio lub przy użyciu gotowego oprogramowania integrującego TZ. Strefę czasową można zapisać po prostu jako ciąg znaków odnoszący się do jednego z wpisów TZ DB , np. „Afryka / Kampala” lub „Europa / Paryż”.

bdsl
źródło