Подтвердить что ты не робот

Как хранить объекты TimeZoneInfo в базе данных?

Немного вводящий в заблуждение титул, я знаю. Никогда на самом деле не хотелось хранить объект TimeZoneInfo самостоятельно: скорее, я хочу сохранить некоторый нейтральный для культуры идентификатор, который впоследствии может быть использован для восстановления экземпляра TimeZoneInfo.

В настоящее время я сохраняю значение свойства TimeZoneInfo.Id и, похоже, все в порядке как на английской, так и на русской версиях Windows, но я просто хотел убедиться, что я поступаю правильно.

4b9b3361

Ответ 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(). Согласно испытаниям, это генерирует уникальный идентификатор целого числа, который может быть сохранен в БД. Вы также можете создать словарь с ключами, являющимися этими хеш-кодами, а значения являются исходными идентификационными строками, чтобы облегчить обратный поиск.