VB.Net конвертировать время из UTC в местное - PullRequest
0 голосов
/ 28 сентября 2018

Я работаю на новостном сайте и сохраняю все даты в базе данных в UTC.Затем, в зависимости от браузера / местоположения машины, я хочу соответственно отобразить дату / время (конвертировать из UTC в Местное время машины / браузера).

Прежде всего, я бы хотелзнаю, делаю ли я это так, как должно или нет (даты UTC в базе данных).

Во-вторых, мне интересно, почему это не так просто сделать в VB.NET?Ниже приведены подходы, которые я пробовал, но ни один из них не работал по мере необходимости:

Подход 1:

TimeZoneInfo.ConvertTimeFromUtC

Это продолжало возвращать время сервера, а не время клиент / машина.

Подход 2:

Dim TimeZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Middle East Standard Time")
Dim Dated As DateTime = TimeZoneInfo.ConvertTimeFromUtC(TempDate, TimeZone)

Это сработало, но не так, как предполагалось.Это преобразовало дату / время UTC в базе данных в Ближневосточный часовой пояс , но любой пользователь из любого другого места в мире увидит только дату / время в Ближневосточный часовой пояс а не в реальном часовом поясе его места.Кроме того, я не уверен, учитывает ли преобразование DayLightSaving или нет.

Подход 3:

Я пытался исправить это с помощью JavaScript,Я создал cookie , который сохраняет смещение из UTC, и попытался обработать offset в VB.NET и выполнить преобразование.

<script>
    function setCookie(cname, cvalue, exdays) {
        var d = new Date();
        d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
        var expires = "expires=" + d.toUTCString();
        document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
    }

    function getTimeOffset() {
        var offset = new Date().getTimezoneOffset();
        setCookie("_tz", offset);
    }
</script>  

JavaScripts возвращает правильное смещение , и я сохраняю это смещение в cookie .Поскольку JavaScript запускается после Page_Load, я вызываю функцию JavaScript getTimeOffset() on Page_Init:

ScriptManager.RegisterStartupScript(Me, Page.GetType, "Script", "getTimeOffset();", True)

Файл cookie создается до того, как страницаотображается, и смещение , сохраненное в cookie , является правильным (это то, что я действительно хочу!).Проблема здесь при первой загрузке.VB.NET читает значение cookie как пустую строку при первой загрузке.На втором Page_Load и далее VB.NET читает значение cookie и правильно выполняет преобразование.

Подход 4

Попытка получить смещение, используя все примерыв этой скрипке но смещение всегда равно 0, что неверно.

Сводка

Интересно, есть ли какая-то функция, которую я пропустил в VB.NET чтобы избежать всех этих хлопот.Не должно ли быть простой задачей преобразовать дату / время из UTC в местное?

Пожалуйста, дайте мне знать, если я что-то делаю неправильно или есть лучшая альтернатива.

1 Ответ

0 голосов
/ 01 октября 2018

Ваш внутренний код ничего не знает о часовом поясе браузера.Не имеет значения, какой язык вы используете, только браузер будет знать что-либо о часовом поясе пользователя.

Когда код .Net (независимо от VB или C #) относится к «локальному», это означает локальныйчасовой пояс , где этот код выполняется .Другими словами, в веб-приложении ASP.Net это локальный часовой пояс вашего сервера , а не пользователя.Вообще говоря, местный часовой пояс сервера обычно не имеет значения.

Чтобы достичь цели, разбейте проблему на две части.

  1. Получите часовой пояс пользователя в браузере, отправьтеэто на сервер.
  2. Преобразование времени на сервере с использованием переданного часового пояса.

Для шага 1 прочитайте этот ответ Я отправил сообщение вдругой вопрос.Обратите внимание, что результатом будет идентификатор часового пояса IANA.Не передавайте числовое смещение , так как оно не содержит достаточной информации для правильного преобразования различных точек во времени (учитывая летнее время и другие аномалии с часовыми поясами).

Для шага 2вам нужно будет выбрать один из следующих подходов:

  • Вы можете использовать идентификатор часового пояса IANA с помощью TimeZoneInfo, если вы используете .NET Core наОС Windows или с библиотекой Noda Time на любой платформе.

  • Вы можете преобразовать идентификатор часового пояса IANA в идентификатор часового пояса Windows, используя мой TimeZoneConverter библиотеки, и затем вы можете использовать результат с классом TimeZoneInfo в Windows.

Одна маленькая вещь: вы использовали TimeZoneInfo.ConvertTimeToUtc, где, я думаю, вы имели в виду TimeZoneInfo.ConvertTimeFromUtc.Будьте осторожны с направленностью конверсий.

Я также укажу, что есть альтернативный подход, который заключается в передаче метки времени UTC вплоть до браузера и просто конвертации из UTC в местное времяв JavaScript.Тогда вам вообще не нужно определять часовой пояс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...