Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Отображение UTC Datetime в часовом поясе, определенном пользователем

Автор вопроса: RomiasОтветов: 1

У меня есть даты в формате UTC в базе данных, и у меня есть часовой пояс пользователя в их таблице настроек.

У меня есть метод расширения для преобразования из UTC в пользовательское время:

public static DateTime ToClientTime(this DateTime dt)
{
     TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("SA Pacific Standard Time"); //Hardcoded timezone
     return TimeZoneInfo.ConvertTimeFromUtc(dt, cstZone);
}

Как вы можете видеть в приведенном ниже коде, на данный момент он имеет жестко заданное имя часового пояса, и я должен передать параметром это значение (передав часовой пояс пользователя).

В CurrentThread я установил культуру пользователя, поэтому весь код в этом запросе ведет себя в этой культуре (форматы даты, ресурсы, числовые форматы). Есть способ сохранить часовой пояс пользователя в глобальном объекте, таком как CurrentThread или что-то в этом роде?

Я пытаюсь избежать передачи часового пояса вышеуказанному методу расширения и вместо этого получить часовой пояс из глобального объекта, такого как CurrentThread. Метод расширения будет вызываться из кода контроллера, а также из представлений.

  • Непонятно, что вы просите. Какая информация у вас есть на самом деле, что вы храните и чего хотите достичь? Покажите примеры с данными и кодом пожалуйста. Matt Johnson-Pint 27.02.2017
  • Храните все свое время в UTC и просто скрывайте его в своих представлениях во всем, что хотите. Pmpr 27.02.2017
  • @MattJohnson, пожалуйста, проверьте мое редактирование, надеюсь, теперь оно более понятно. Romias 27.02.2017
  • Похоже, вы спрашиваете, как сохранить что-либо в текущем потоке. Может быть идентификатор часового пояса, может быть какая-то случайная строка. Вы можете поискать/спросить об этом отдельно. Имейте в виду, что с современным асинхронным/ожидающим кодом вам не гарантируется продолжение в том же потоке. Это может быть проблематично для более старых вещей, таких как ThreadLocal и ThreadStatic. Вы можете попробовать контекст логического вызова (CallContext.LogicalSetData/CallContext.LogicalGetData). Matt Johnson-Pint 28.02.2017
  • Спасибо, Мэтт... Текущая ветка была примером... но я понял идею. Если вы опубликуете свой комментарий как ответ, я могу пометить его как отвеченный. Romias 28.02.2017

utctimezone

Ответы

Ответ 1 · рейтинг -1 · gdmanandamohon

У вас есть базовое время, такое как UTC, верно? У вас нет указанного пользователем часового пояса в базе данных. Так что теперь вы можете добавлять или вычитать из часового пояса UTC в зависимости от необходимости.

Вероятно, добавление может обеспечить простое решение. Пример:

Name ----------TimeZone
------------------------
Nick  ------- UTC - 6
Hary  ------- UTC + 1

Итак, если текущее время UTC равно 19:00 или 18:00, то

Nick = 18-6 = 12 / 12 PM
Harry = 18+1 = 19 / 8PM

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы