У нас есть веб-приложение ASP.Net 2.0, работающее с сервером на Среднем Западе (восточное стандартное время). В настоящий момент все наши клиенты находятся в том же часовом поясе, что и сервер. Мы вводим в действие еще один сервер в Аризоне (горное стандартное время).
Мы все время сохраняем время в базе данных SQL 2005 через программный код C# DateTime.UtcNow.
Во время тестирования мы столкнулись с некоторыми проблемами преобразования часовых поясов. Наша проблема в том, что в веб-браузере время отображается по горному стандартному времени, а не по часовому поясу, в котором мы тестируем время, и по восточному поясному времени.
Когда мы вводим новую информацию, она сохраняется в базе данных в формате UTC, но когда мы переходим к просмотру этой информации в браузере, отображается стандартное горное время. Ниже приведен код, который берет значение UTC из базы данных и отображает его в браузере.
lblUpdatedDate.Text = Convert.ToDateTime(dr["UpdatedDate"]).ToLocalTime().ToString();
Приведенный выше код возвращает стандартное горное время в месте расположения сервера, а не стандартное восточное время, в котором работает браузер. Как получить время, чтобы отображать, где находится пользователь?





Если вы используете .NET 3.5 и, вы знаете часовой пояс, в котором находится пользователь, TimeZoneInfo - ваш друг. Если вы не используете .NET 3.5, есть несколько примеров P / Invoke для получения экземпляров Часовой пояс, но этого стоит избегать, если у вас есть доступ к 3.5. (TimeZoneInfo имеет исторические данные и т. д. И обычно является предпочтительным способом.)
Теперь выяснить, в каком часовом поясе находятся ваши пользователи, - другая проблема. Самый простой способ избежать путаницы - предоставить им варианты. (Получение смещения «сейчас» дает вам лишь ограниченную информацию.)
Местное время всегда будет на стороне сервера преобразовано в физическое местоположение. У вас есть несколько вариантов.
Я сталкивался с чем-то подобным до использования 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);
}