Проблема с часовым поясом веб-приложения

У нас есть веб-приложение ASP.Net 2.0, работающее с сервером на Среднем Западе (восточное стандартное время). В настоящий момент все наши клиенты находятся в том же часовом поясе, что и сервер. Мы вводим в действие еще один сервер в Аризоне (горное стандартное время).

Мы все время сохраняем время в базе данных SQL 2005 через программный код C# DateTime.UtcNow.

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

Когда мы вводим новую информацию, она сохраняется в базе данных в формате UTC, но когда мы переходим к просмотру этой информации в браузере, отображается стандартное горное время. Ниже приведен код, который берет значение UTC из базы данных и отображает его в браузере.

lblUpdatedDate.Text = Convert.ToDateTime(dr["UpdatedDate"]).ToLocalTime().ToString();

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
5 516
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Если вы используете .NET 3.5 и, вы знаете часовой пояс, в котором находится пользователь, TimeZoneInfo - ваш друг. Если вы не используете .NET 3.5, есть несколько примеров P / Invoke для получения экземпляров Часовой пояс, но этого стоит избегать, если у вас есть доступ к 3.5. (TimeZoneInfo имеет исторические данные и т. д. И обычно является предпочтительным способом.)

Теперь выяснить, в каком часовом поясе находятся ваши пользователи, - другая проблема. Самый простой способ избежать путаницы - предоставить им варианты. (Получение смещения «сейчас» дает вам лишь ограниченную информацию.)

Местное время всегда будет на стороне сервера преобразовано в физическое местоположение. У вас есть несколько вариантов.

  1. Сохраните значение смещения от UTC для пользователей, сохраните время в UTC
  2. Сделайте конверсию на стороне клиента через JS (на мой взгляд, это не изящно и не уместно)
  3. Посмотрите на Рекомендации MSDN и пространство имен Timezone

Я сталкивался с чем-то подобным до использования ASP.NET. Вот моя общая методика.

Я отправил JavaScript, чтобы сделать document.write. JavaScript определяет смещение клиента от GMT. Таким образом, вы можете отправить конкретное время, а затем позволить JavaScript сделать для него плюс / минус.

Ответ принят как подходящий

Я была такая же проблема. Мы продали наше приложение пользователю, который находился в другом часовом поясе, чем веб-сервер. Мы не хранили информацию о времени в формате UTC, но на самом деле она работала правильно. Время, отображаемое в часовом поясе сервера, отставало ровно на 3 часа. Все, что нам нужно было сделать, это добавить раскрывающийся список часового пояса, чтобы они могли выбрать свой часовой пояс для всего сайта (поскольку единственные пользователи приложения будут в их часовом поясе). Мы сохранили этот параметр, а затем вставили функцию для преобразования всех отображений даты и времени из одного часового пояса в другой с использованием пространства имен TimeZoneInfo. Работает отлично.

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

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

Мы создали служебный метод (SetAllDateModes), который преобразует все поля даты и времени в наборе данных по таблицам - вот бизнес-конец (Foreach) и вызов, который устанавливает dateMode:

foreach (DataColumn dc in dt.Columns)
{
  if (dc.DataType == typeof(DateTime))
  {
    dc.DateTimeMode = dateMode;
  }
}
SetAllDateModes(dt, DataSetDateTime.Unspecified);

DateSetDateTime.Unspecified не включает смещение, поэтому преобразование не выполняется.

Я думал, что общая идея заключалась в том, чтобы не локализовать дату и время, пока вы не представите их пользователю. Таким образом, если человек не собирается его читать, он остается в формате UTC, GMT, CUT. Еще одно примечание: используйте библиотеку даты / времени, поэтому вам не нужно сильно беспокоиться о проблемах с переходом на летнее время.

Просто всегда храните дату и время в формате GMT.

Есть 2 шага:

Определите другой часовой пояс на стороне клиента с помощью Javascript:

var dt = new Date();
var diffInMinutes = -dt.getTimezoneOffset();

Затем на стороне сервера код C# для преобразования времени сервера во время клиента на основе обнаруженного смещения часового пояса выше:

string queryStr = Request.QueryString["diffInMinutes"];
int diffInMinutes = 0;
if (Int32.TryParse(queryStr, out diffInMinutes))
{
    clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes);
}

Другие вопросы по теме