У меня есть веб-сайт, размещенный в другом часовом поясе, чем пользователи, использующие приложение. В дополнение к этому пользователи могут иметь определенный часовой пояс. Мне было интересно, как к этому подходят другие пользователи и приложения SO? Наиболее очевидная часть заключается в том, что внутри БД дата/время хранятся в формате UTC. Когда на сервере все даты/время должны обрабатываться в формате UTC. Однако я вижу три проблемы, которые я пытаюсь преодолеть:
-
Получение текущего времени в UTC (легко решается с помощью
DateTime.UtcNow
). -
Вытягивание даты/времени из базы данных и их отображение пользователю. Существует много вызовов для печати дат в разных представлениях. Я думал о некотором слое между представлением и контроллерами, которые могли бы решить эту проблему. Или иметь собственный метод расширения на
DateTime
(см. Ниже). Основная нижняя сторона заключается в том, что в каждом месте использования даты и времени в представлении должен быть вызван метод расширения!Это также затруднит использование чего-то типа
JsonResult
. Вы уже не могли бы просто позвонитьJson(myEnumerable)
, это должно бытьJson(myEnumerable.Select(transformAllDates))
. Может быть, AutoMapper может помочь в этой ситуации? -
Получение ввода от пользователя (Local to UTC). Например, для POST-формы с датой потребуется преобразовать дату в UTC раньше. Первое, что приходит на ум, - создать пользовательский
ModelBinder
.
Здесь расширения, которые я думал использовать в представлениях:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
Я бы подумал, что иметь дело с часовыми поясами будет такая распространенная вещь, учитывая, что множество приложений теперь облачно, где локальное время сервера может сильно отличаться от ожидаемого часового пояса.
Это было изящно решено раньше? Есть что-то, что мне не хватает? Идеи и мысли очень ценятся.
РЕДАКТИРОВАТЬ: Чтобы устранить некоторую путаницу, я подумал добавить несколько подробностей. Проблема сейчас заключается не в том, как хранить время UTC в db, это больше о процессе перехода от UTC- > Local и Local- > UTC. Как указывает @Max Zerbini, очевидно, что разумно поместить UTC- > Local code в представление, но использует ли ответ DateTimeExtensions
? Получая ввод от пользователя, имеет ли смысл принимать даты в качестве локального времени пользователя (с тех пор, как JS будет использовать), а затем использовать ModelBinder
для преобразования в UTC? Часовой пояс пользователя хранится в БД и легко извлекается.