У меня есть веб-сайт, который размещен в другом часовом поясе, чем пользователи, использующие приложение. В дополнение к этому у пользователей может быть определенный часовой пояс. Мне было интересно, как к этому подходят другие пользователи и приложения SO? Наиболее очевидная часть заключается в том, что внутри БД дата и время хранятся в формате UTC. На сервере все дата / время должны обрабатываться в формате UTC. Однако я вижу три проблемы, которые пытаюсь преодолеть:
Получение текущего времени в формате UTC (легко решается с помощью
DateTime.UtcNow
).Получение даты / времени из базы данных и отображение их пользователю. Существует потенциально много вызовов для печати дат в разных представлениях. Я думал о каком-то промежуточном уровне между представлением и контроллерами, который мог бы решить эту проблему. Или иметь собственный метод расширения
DateTime
(см. Ниже). Основным недостатком является то, что в каждом месте использования даты и времени в представлении необходимо вызывать метод расширения!Это также усложнило бы использование чего-то вроде
JsonResult
. Вы уже не могли бы легко позвонитьJson(myEnumerable)
, это должно было бытьJson(myEnumerable.Select(transformAllDates))
. Может быть, AutoMapper поможет в этой ситуации?Получение ввода от пользователя (локально по 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 в базе данных, а в процессе перехода от UTC-> Local и Local-> UTC. Как указывает @Max Zerbini, очевидно, разумно поместить код UTC-> Local в представление, но DateTimeExtensions
действительно ли используется ответ? При получении ввода от пользователя имеет ли смысл принимать даты как местное время пользователя (поскольку это то, что будет использовать JS), а затем использовать a ModelBinder
для преобразования в UTC? Часовой пояс пользователя хранится в БД и его легко получить.