Как хранить объекты TimeZoneInfo в базе данных? - PullRequest
13 голосов
/ 10 августа 2010

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

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

Ответы [ 4 ]

16 голосов
/ 10 августа 2010

Да, Id - это нелокализованный идентификатор, так что это подходящая вещь для хранения.

Однако вы должны знать об одной возможной проблеме: идентификаторы могут со временем меняться.Я не знаю, является ли это проблемой в Windows идентификаторах часовых поясов, но это, безусловно, происходит в базе данных Olson (zoneinfo).Например, недавно я рассматривал проблему, вызванную изменением «Pacific / Ponape» на «Pacific / Pohnpei».

Я подозреваю, что, поскольку Microsoft имеет более жесткий контроль над идентификаторами, они с большей вероятностью останутсято же самое - но даже в этом случае страны могут изменить свои имена, разделить их на разные страны (потенциально создавая новые часовые пояса) и т. д.

Я не предлагаю никаких исправлений для этой проблемы - простовыделив его как потенциальную проблему.Хранение идентификатора, вероятно, является наилучшим доступным подходом, но помните о потенциальных рисках ...

10 голосов
/ 10 августа 2010

Я не вижу проблемы с хранением идентификаторов, так как они кажутся постоянными значениями для платформы Windows - то есть конкретный идентификатор всегда будет отображаться на один и тот же объект TimeZoneInfo независимо от того, какая версияокна, которые вы используете.

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

0 голосов
/ 23 ноября 2013

Я просто использовал TimeZoneInfo.Id.GetHashCode ().Согласно тестам, это генерирует уникальные целочисленные идентификаторы, которые могут быть сохранены в БД.Вы также можете создать словарь, ключами которого будут эти хеш-коды, а значениями будут исходные строки идентификаторов, чтобы упростить обратный поиск.

0 голосов
/ 10 августа 2010

проверьте эти два метода

public static System.TimeZoneInfo FromSerializedString(string source)
public string ToSerializedString()

они должны сохранить как можно больше информации:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...