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

У меня есть даты в формате 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. Метод расширения будет вызываться из кода контроллера, а также из представлений.


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


Ответы (1)


У вас есть базовое время, такое как 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
person gdmanandamohon    schedule 27.02.2017
comment
Часовой пояс != Смещение. Кроме того, .NET имеет множество встроенных функций для этого, не прибегая к ручной арифметике. - person Matt Johnson-Pint; 27.02.2017