Как мне получить результат передачи javascript new Date (). GetTimezoneOffset () в C# бэкэнд? - PullRequest
0 голосов
/ 03 августа 2020

См. Заголовок: для решения, над которым я работаю, мне нужно получить текущее смещение часового пояса (от клиента, выполняющего javascript / jQuery) и использовать его в коде C# серверной части. Вопрос довольно похож на тот, который задан здесь , но есть несколько отличий, главное из которых состоит в том, что я почти уверен, что время на клиентском компьютере не будет изменено. Итак, new Date (). GetTimezoneOffset () подойдет.

Я не могу прочитать значение при отправке формы, поскольку пользователь не работает с формой: после того, как пользователь вошел в систему в, среди элементов, которые видны на экране, есть таблица с данными, введенными пользователем или другими пользователями. Эти данные содержат UT C datetime, которые необходимо скорректировать в соответствии с часовым поясом клиента. Код C# отвечает за извлечение и форматирование данных - отсюда и мой вопрос.

Что было бы достаточно, так это где-то хранить значение, чтобы C# мог прочитать его при необходимости. Но я не думаю, что это можно сделать. Какой здесь подход?

Заранее спасибо!

1 Ответ

2 голосов
/ 04 августа 2020

Предлагаемый вами подход ошибочен в том, что смещение current из клиентского браузера будет применяться только к текущей дате и времени. В действительности смещения часовых поясов меняются со временем в пределах данного часового пояса. Вы не можете просто взять единичное смещение от одного момента времени и рассчитывать использовать его для преобразования других дат и времени в тот же часовой пояс. Вместо этого вам нужно использовать строку, которая идентифицирует часовой пояс , а не смещение от этого пояса.

В качестве примера рассмотрим восточный часовой пояс в Соединенных Штатах. Некоторое время года здесь используется UT C -5, и мы называем это восточно-американским стандартным временем (EST). В другое время года используется UT C -4, и мы называем это восточным летним временем (EDT). Этот часовой пояс определяется либо идентификатором часового пояса IANA "America/New_York", либо Windows идентификатором часового пояса "Eastern Standard Time" (который охватывает всю зону, как EST, так и EDT, несмотря на его формулировку).

Итак , разбейте эту проблему на несколько этапов:

  1. В JavaScript укажите часовой пояс пользователя IANA (America/New_York):

    • Если вы ориентируетесь на современные веб-браузеры, вы можете вызвать эту функцию:

      Intl.DateTimeFormat().resolvedOptions().timeZone
      
    • Если вам нужно поддерживать старые веб-браузеры, вы можете использовать jsTimeZoneDetect , или moment.tz.guess() из Moment-Timezone .

  2. Отправьте эту строку на ваш веб-сервер через любой понравившийся вам механизм (форма сообщения, XHR , fetch, et c.)

  3. Получите эту строку в коде. NET и используйте ее для ссылки на часовой пояс и выполнения преобразования. У вас есть два варианта:

    • Вы можете использовать Noda Time , передав идентификатор часового пояса IANA в DateTimeZoneProviders.Tzdb, как показано в примере на домашней странице.

    • Вы можете использовать встроенный объект NET. *1078*. Если вы используете. NET Core в системах, отличных от Windows (Linux, OSX, и т. Д. c.), Вы можете просто передать идентификатор часового пояса IANA в TimeZoneInfo.FindSystemTimeZoneById. Если вы используете Windows, вам нужно сначала преобразовать его в идентификатор часового пояса Windows ("Eastern Standard Time"). Вы можете использовать TZConvert.GetTimeZoneInfo из моей библиотеки TimeZoneConverter .

  4. Если у вас есть DateTimeZone от Noda Time или TimeZoneInfo, вы можете использовать методы для преобразования значений UT C в значения местного времени для этого часового пояса. Каждый из них будет применять правильное смещение для преобразуемого момента времени.

Я также скажу, что многие приложения просто просят пользователя выбрать свой часовой пояс из раскрывающегося списка и сохраните его в профиле пользователя. Пока вы храните строку идентификатора часового пояса, а не только смещение numeri c, этот подход вполне приемлем для замены шагов 1 и 2, описанных выше.

...