Какова наилучшая практика для сохранения часовых поясов в базе данных?

12

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

Я использую сервер Microsoft SQL, .net mvc, C #. Любые предложения будут ценны.

Родни
источник
2
stackoverflow.com/questions/3446906/…
Роберт Харви
Кстати, нормальный часовой пояс должен использовать int, но некоторые часовые пояса могут быть + или - 30 минут, или даже 15 минут :) О, и помните, что это не точная наука, переход на летнее время и тому подобное могут сбить вас с толку.
Rocklan
2
@LachlanB Одним из способов является то, что часовой пояс - это больше местоположение, чем смещение . Но даже такой точки зрения недостаточно, например, Россия недавно изменила свою политику в отношении перехода на летнее время, что означает, что вам придется относиться к ней по-разному в зависимости от фактической даты.
Даниэль Б

Ответы:

7

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

Из этой базы данных вы можете узнать смещение времени и время перехода на летнее время. Это не просто временной сдвиг, он также дает вам область, поэтому многие места на одной широте будут иметь разные коды и могут индивидуально изменять свои правила часового пояса, и ваше программное обеспечение сможет справиться с этим.

Единственный момент, когда вам нужно внести изменения в вашу базу данных, это когда местоположение меняет часовой пояс, к которому оно принадлежит, что будет очень редко.

gnasher729
источник
Обратите внимание, что список в Википедии не содержит двухсимвольных сокращений для всех часовых поясов IANA, плюс сопоставление не является однозначным. Если вам нужна полная историческая информация, используйте полные имена.
Халк
2
Единственные двухбуквенные коды, которые я вижу на странице Википедии, - это коды стран. Они не однозначно определяют часовые пояса. Например, все часовые пояса в США имеют одинаковый двухбуквенный код страны: США. Точно так же во всей Австралии есть код страны AU.
Ян
3

Абсолютно наилучшей практикой будет использование базы данных, которая поддерживает TIMESTAMP WITH TIMEZONEтип данных, определенный SQL99.

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

Blrfl
источник
3

Предполагая, что вы используете .Net Framework 4.0 или выше, TimeZoneInfo - это то, что вам нужно.

Сохраните все значения даты в базе данных в формате UTC. Используйте значение ID или результат ToSerializedString () для каждого клиента, чтобы создать объект TimeZoneInfo для преобразования сохраненных дат в локальный формат для отображения.

сапсан
источник
2

Вы сказали, что хотите сохранить часовой пояс для каждого адреса в вашей БД, но не сказали, что вы хотите с ним делать. Хранение чего-либо в БД редко является самоцелью.

В любом случае я хотел бы использовать базу данных TZ, то есть базу данных Olsen, напрямую или с помощью некоторого готового программного обеспечения, которое интегрирует TZ. Вы можете сохранить часовой пояс просто в виде строки для ссылки на одну из записей БД TZ , например, «Африка / Кампала» или «Европа / Париж».

bdsl
источник