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