Проблема с часовым поясом веб-приложения - PullRequest
5 голосов
/ 27 октября 2008

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

Мы храним все время в базе данных SQL 2005 с помощью C # codebehind DateTime.UtcNow.

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

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

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

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

Ответы [ 7 ]

6 голосов
/ 27 октября 2008

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

3 голосов
/ 27 октября 2008

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

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

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

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

2 голосов
/ 27 октября 2008

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

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

1 голос
/ 27 апреля 2015

Просто всегда храните дату и время в формате 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);
}
0 голосов
/ 27 октября 2008

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

0 голосов
/ 27 октября 2008

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

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

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

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

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

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