Хранение DateTimeOffset для приложения, чувствительного к часовому поясу - PullRequest
4 голосов
/ 12 июня 2011

Если я сохраню все свои даты с использованием DateTimeOffset, мне все равно нужно будет всегда преобразовывать дату в UTC или будет эффективным иметь только DateTimeOffset?

1 Ответ

7 голосов
/ 12 июня 2011

Ответ - это зависит.

DateTimeOffset - это отметка времени + смещение UTC.Проблема состоит в том, что несколько часовых поясов могут совместно использовать одно и то же смещение, но они могут не использовать одни и те же правила перехода на летнее время (помимо прочего), и поскольку DateTimeOffset не имеет никакого понятия о TimeZone, это приводит к неоднозначности.Однако это может быть хорошо, если вы храните временные метки на стороне сервера, которые не отображаются пользователю, и пользователь не взаимодействует с ними.Примером этого может быть регистрация на стороне сервера, я думаю.

ИМХО самый безопасный подход при работе с пользовательским вводом, отображением пользователя, запросом пользователя и т. Д., И т. Д., Это хранить DateTime s и сохранять полный часовой поясИнформация.Вы можете использовать TimeZoneInfo.Serialize(...), который выводит полную информацию о часовом поясе в строку и сохраняет ее в базе данных, которую впоследствии можно десериализовать в экземпляр TimeZoneInfo через TimeZoneInfo.Deserialize(...) и использовать для преобразования DateTime в местное / utc datetime.Это безопасно, потому что нет никакой двусмысленности, а также даже если часовой пояс изменяется (и они меняются - например, изменения летнего времени), ваши данные все еще непротиворечивы.Конечно, вам нужно будет позаботиться об обновлении базы данных, чтобы поддерживать ее синхронизацию (довольно редко).

При вышеупомянутом подходе вы можете сохранить DateTimes в UTC или Local, и вам нужно решить, какая из них зависитна случай использования.При хранении дат и времени в UTC одна забавная вещь заключается в том, что понятие «сегодня» пользователя становится немного более сложным - об этом можно прочитать в моем блоге здесь .

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