Как хранить объекты TimeZoneInfo в базе данных?
Немного вводящий в заблуждение титул, я знаю. Никогда на самом деле не хотелось хранить объект TimeZoneInfo
самостоятельно: скорее, я хочу сохранить некоторый нейтральный для культуры идентификатор, который впоследствии может быть использован для восстановления экземпляра TimeZoneInfo
.
В настоящее время я сохраняю значение свойства TimeZoneInfo.Id
и, похоже, все в порядке как на английской, так и на русской версиях Windows, но я просто хотел убедиться, что я поступаю правильно.
Ответы
Ответ 1
Да, Id
- нелокализованный идентификатор, поэтому необходимо сохранить соответствующую вещь.
Вы должны знать об одной возможной проблеме: идентификаторы могут меняться со временем. Я не знаю, является ли это проблемой в идентификаторах часовых поясов Windows, но это, безусловно, происходит в базе данных Olson (zoneinfo). Например, я недавно рассматривал проблему, вызванную изменением "Pacific/Ponape" на "Pacific/Pohnpei".
Я подозреваю, что, поскольку Microsoft имеет более жесткий контроль над идентификаторами, они, скорее всего, останутся прежними - но даже в этом случае страны могут менять свои имена, разделяться на разные страны (потенциально создавать новые часовые пояса) и т.д.
Я не предлагаю никаких исправлений для этой проблемы - просто подчеркиваю ее как потенциальную проблему. Хранение идентификатора, вероятно, является лучшим подходом, но помните о потенциальных рисках...
Ответ 2
Я не вижу проблемы с хранением идентификаторов, поскольку они кажутся постоянным значением на платформе Windows, то есть определенный идентификатор всегда будет отображаться на тот же объект TimeZoneInfo
, независимо от того, какая версия окна, которые вы используете.
Я не уверен, что делает моно, но я не удивлюсь, если это будет то же самое. Вы всегда можете проверить исходный код класса.
Ответ 3
проверьте эти два метода
public static System.TimeZoneInfo FromSerializedString(string source)
public string ToSerializedString()
они должны сохранять как можно больше информации:)
Ответ 4
Я просто использовал TimeZoneInfo.Id.GetHashCode(). Согласно испытаниям, это генерирует уникальный идентификатор целого числа, который может быть сохранен в БД. Вы также можете создать словарь с ключами, являющимися этими хеш-кодами, а значения являются исходными идентификационными строками, чтобы облегчить обратный поиск.