Яка найкраща практика збереження TimeZones у базі даних?


13

Ми хочемо почати збирати часові пояси для кожної з наших адрес у базі даних. Яка найкраща практика зберігання часових поясів? Як би ви вирішили придбати часові пояси для існуючих записів адрес?

Я використовую сервер Microsoft SQL, .net mvc, C #. Будь-які пропозиції будуть дуже вдячні.



Btw нормальний часовий пояс - це використання int, але деякі часові пояси можуть бути + або - 30 хв, а то й 15 хв.
Rocklan

2
@LachlanB Одним із способів сказати, що часовий пояс - це більше місце, ніж зміщення часу . Але навіть така думка недостатня сама по собі, наприклад, нещодавно Росія змінила свою політику щодо літнього часу, це означає, що вам доведеться ставитися до неї по-різному в залежності від фактичної дати.
Даніель Б

Відповіді:


7

Ви хочете зберігати щось, що не змінюється весь час (або два рази на рік). База даних часового поясу https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - це абсолютно правильна річ. Отже, ви просто зберігаєте дві букви.

З цієї бази можна дізнатись про зміщення часу та коли активний час влітку. Це не просто зміщення часу, це також дає вам площу, тому багато місць на одній широті матимуть різні коди і можуть індивідуально змінювати свої правила часового поясу, і ваше програмне забезпечення зможе це впоратися.

Єдиний час, коли вам потрібно внести зміни до вашої бази даних, коли місце змінюється, до якого часового поясу належить, що було б дуже рідко.


Зауважте, що список у вікіпедії не містить 2-символьних абревіатур для всіх часових поясів IANA - плюс відображення не є однозначним. Якщо вам потрібна повна історична інформація, перейдіть замість повних імен.
Халк

2
Єдині два буквених коди, які я бачу на сторінці Вікіпедії, - це коди країн. Вони не визначають однозначно часових поясів. Наприклад, усі часові пояси в США мають однаковий код країни з двома літерами: US. Так само по всій Австралії є код країни АС.
Ян

3

Абсолютною найкращою практикою було б використання бази даних, яка підтримує TIMESTAMP WITH TIMEZONEтип даних, визначений SQL99.

SQL Server має тип, який називається, datetimeoffsetщо робить усе TIMESTAMP WITH TIMEZONE, крім збереження фактичного часового поясу. Все, що ви можете зробити, це зберегти зміщення від UTC (наприклад, 2013-05-04 12:34:56 -5:00), що означає, що вам доведеться визначити це перед зберіганням на основі часового поясу.


3

Припускаючи, що ви використовуєте .Net Framework 4.0 або новішої версії , TimeZoneInfo - те, що вам потрібно.

Зберігати всі значення дати в базі даних у форматі UTC. Використовуйте або значення ID, або результат ToSerializedString () для кожного клієнта, щоб створити об’єкт TimeZoneInfo для перетворення збережених дат у локальний формат для відображення.


2

Ви сказали, що хочете зберегти часовий пояс для кожної адреси у вашому БД, але ви не сказали, що з цим хочете зробити. Зберігання чогось у БД рідко є самоціллю.

У будь-якому випадку я б хотів використати базу даних TZ , також базу даних Olsen, безпосередньо чи за допомогою програмного забезпечення, що інтегрує TZ. Ви можете зберігати часовий пояс просто як рядок для посилання на один із записів TZ DB , наприклад, "Африка / Кампала" або "Європа / Париж".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.