Я создаю приложение MVC 3, где пользователи могут не находиться в одном и том же часовом поясе, поэтому я намерен хранить все в UTC и конвертировать из UTC в локальное время в представлениях и по местному времени в UTC по сообщениям.
Выполнение некоторых видов просмотра, хотя, похоже, для этого не существует много хороших решений. Честно говоря, я вроде как ожидал, что атрибут будет доступен для автоматического преобразования времени UTC в локальное время, но, похоже, не существует.
Я чувствую, что просто стараюсь усердно вручную конвертировать каждый вход в UTC, и преобразование каждого вида в локальное время вручную будет очень подвержено ошибкам и приведет к трудному обнаружению ошибок, когда время не преобразуется в или из.
Любые предложения о том, как справиться с этим как общей стратегией?
ИЗМЕНИТЬ Все кажутся очень зацикленными на "как мне получить клиентский часовой пояс", что, как я упоминаю в одном из комментариев, не вызывает беспокойства. Я в порядке с настройкой пользователя, которая определяет их часовой пояс, поэтому предположим, что я уже знаю, что такое часовой пояс клиента..., который не затрагивает мою проблему.
Прямо сейчас, при каждом представлении, когда я делаю дату, мне нужно будет вызвать метод, чтобы отобразить его в локальном часовом поясе от utc. Каждый раз, когда я отправляю дату для отправки на сервер, мне нужно преобразовать его из локального часового пояса в UTC. Если я забуду сделать это, будут проблемы... либо дата отправки будет неправильной, либо отчеты на стороне клиента и фильтры будут неправильными.
То, что я надеялся существовать, было более автоматизированным методом, тем более, что модель представления строго типизирована в MVC 3. Я надеялся на суммарную магию, чтобы иметь возможность по крайней мере автоматически отображать в часовом поясе, если не обрабатывать представление, так же, как формат даты или диапазон можно контролировать с помощью атрибута.
Так нравится
[DateRange]
Public DateTime MyDate
Я мог бы что-то вроде
[ConvertToUTC(offset)]
Public DateTime MyDate
В любом случае, я думаю, что мой единственный подход заключался бы в написании пользовательской аннотации данных для рендеринга его в часовом поясе и переопределении в связующем устройстве MVC 3, чтобы входящие даты были преобразованы, если я не хочу обернуть любую дату в вызове метода. Поэтому, если у кого-то нет дальнейших комментариев или предложений, это будет один из этих двух вариантов, я просто удивлен, что чего-то еще не существует для этого.
Если я реализую решение, я обязательно отправлю его.
Изменить 2 Что-то вроде этого http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx для моделей MVC 3 и моделей просмотра - это то, что я ищу.
Final Edit Я отметил ответ epignosisx как правильный, но также добавил несколько комментариев. Я нашел здесь нечто похожее: http://dalldorf.com/blog/2011/06/mvc3-timezones-1/ С реализацией получения часового пояса от клиента, поместив его в файл cookie для людей, которые хотят этого в части 2 (ссылка ниже, поскольку ссылка в первой части статьи на часть 2 не работает) http://dalldorf.com/blog/2011/09/mvc3-timezones-2/
Важно отметить эти подходы, что вы ДОЛЖНЫ использовать Editfor и Displayfor вместо таких вещей, как TextForFor, поскольку только EditFor и DisplayFor используют поставщиков метаданных, используемых для указания MVC, как отображать свойство этого типа в модели. Если вы получите доступ к значениям модели непосредственно в представлении (@Model.MyDate), преобразование не произойдет.