Принудительное нахождение DateTime в определенном часовом поясе, учитывая только DateTime с неопределенным часовым поясом - PullRequest
0 голосов
/ 10 октября 2018

У меня свидание, скажите "2016-10-20 20:34:60".Когда я создаю эту дату и время, я не уверен, как указать, что этот DateTime был создан на основе локального часового пояса серверов.В данном случае это «Тихоокеанское стандартное время».

Я хочу представить это как текст по умолчанию и текст данных.Этот текст данных будет использоваться через JavaScript для изменения даты на местное время пользователя.

Я новичок в C # и пытаюсь обдумать, как это сделать.Многие из приведенных примеров используют время UTC.Мы храним даты, основываясь на локальном времени серверов.

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

Ответы [ 3 ]

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

Вы можете получить текущий часовой пояс с помощью

TimeZoneInfo.Local

В качестве альтернативы вы можете получить текущее смещение следующим образом:

DateTimeOffset.Now

Вам необходимо сохранить соответствующую информацию вбаза данных вместе с вашей датой и временем.

РЕДАКТИРОВАТЬ В соответствии с комментарием ниже и https://docs.microsoft.com/en-us/dotnet/standard/datetime/ TimeZone.CurrentTimeZone был заменен.Вместо этого используйте TimeZoneInfo.Local.Ответ был изменен, чтобы отразить это.

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

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

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

Если независимо от того, что вы все еще хотите утверждать, что значение DateTime отражает местный часовой пояс компьютера, вы сделаете это, обеспечив DateTimeKind.Localустанавливается в свойстве .Kind.Это может быть сделано в параметре конструктора, или с DateTimeStyles.AssumeLocal при разборе, или с DateTime.SpecifyKind для существующего значения.Затем вы можете использовать .ToUniversalTime() для преобразования в UTC перед отправкой его конечному пользователю.

Однако я настоятельно рекомендую вам использовать DateTimeOffset.В отличие от DateTime, он будет сохранять смещение и учитывать его для большинства операций.Если вы создадите DateTimeOffset из DateTime с DateTimeKind.Unspecified, по умолчанию будет использоваться местный часовой пояс.Точно так же, если вы создаете его с помощью синтаксического анализа (DateTimeOffset.Parse, .TryParse, .ParseExact, .TryParseExact и т. Д.), Если во входной строке нет смещения, по умолчанию также будет использоваться местный часовой пояс.

ОДНАКО - ни один из этих объектов фактически не будет отслеживать часовой пояс таким образом, чтобы должным образом учитывать переходы (например, когда летнее время перемещает тихоокеанское время между PST и PDT и наоборот),Если это то, что вы ищете - извините, вам не повезло со встроенными типами.Вместо этого вам нужно будет использовать класс ZonedDateTime из библиотеки с открытым исходным кодом Noda Time .

Также вы указали:

...Этот текст данных будет использоваться через JavaScript для изменения даты на местное время пользователя.

Это не невозможно, но довольно сложно получить JavaScript для преобразования даты и времени в локальное время пользователячасовой пояс, если у вас также нет смещения.Сериализация значения DateTimeOffset обратно в браузер даст вам это для отображения, но если вы попросите пользователя изменить значение, вам придется каким-то образом преобразовать его обратно.

Все намного проще, если вы просто передаете значения UTC между браузером и сервером.Тогда вы можете просто конвертировать UTC в местное время и наоборот в браузере.(По крайней мере, для значений даты и времени. Не пытайтесь преобразовывать значения только для даты.)

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

Вы можете использовать

    TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific SA Standard Time");

DateTime newDateTime = TimeZoneInfo.ConvertTime(existingDateTime, timeZoneInfo);

Вы можете найти больше информации и примеров здесь и всех часовых поясов здесь

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