Я бы порекомендовал всегда использовать время UTC (GMT) на стороне сервера (в коде позади, базе данных и т. Д.) И конвертировать время из UTC в местное время для отображения * Только 1004 *. Это означает, что все манипуляции с временем, включая экономию времени в базе данных, выполнение расчетов и т. Д., Должны выполняться с использованием UTC.
Проблема в том, как ваш программный код знает, какой часовой пояс находится в браузере клиента? Допустим, пользователь вводит в форму некоторое значение даты / времени (например, 12/30/2009 14: 30 ) и отправляет его на сервер. Предполагая, что пользователь отправил местное время, как сервер узнает, как преобразовать это значение в UTC?
Приложение может попросить пользователя указать часовой пояс (и сохранить его в постоянном файле cookie или базе данных), но это потребует от пользователя дополнительных усилий, и вашему приложению потребуется реализовать логику и экраны для этого. Было бы лучше, если бы приложение могло автоматически определять часовой пояс клиента .
Я решил эту проблему с помощью функции JavaScript getTimezoneOffset , которая является единственным API, который может сообщать серверу о разнице во времени между локальным временем клиента и GMT. Поскольку это API-интерфейс на стороне клиента, я сделал следующее: на стороне сервера проверил наличие файла cookie пользовательского сеанса, содержащего значение смещения времени, и, если он недоступен, перезагрузите страницу (только во время вызовов GET, а не POST) с некоторой логикой JavaScript, добавленной для генерации временного смещения и сохранения его в файле cookie. Со стороны клиента это почти прозрачно (однажды во время сессии я перезагружаю страницу на GET). Получив смещение в файле cookie, я применяю его к функциям управления временем в зависимости от направления преобразования времени (UTC по местному времени или местное время по UTC).
Это может показаться немного сложным, и это так, но после того, как я написал вспомогательные функции, интеграция этой функции на сайте была вопросом выполнения одиночного вызова в Page_Load (страниц, которые требовали преобразования времени). ) и использование процедур преобразования времени при отправке и получении значений времени в браузере и из него. Вот пример того, как его можно использовать:
using My.Utilities.Web;
...
// Derive the form class from BaseForm instead of Page.
public class WebForm1: BaseForm
{
...
private void Page_Load(object sender, System.EventArgs e)
{
// If we only want to load the page to generate the time
// zone offset cookie, we do not need to do anything else.
if (InitializeLocalTime())
return;
// Assume that txtStartDate is a TextBox control.
if (!IsPostback)
{
// To display a date-time value, convert it from GMT (UTC)
// to local time.
DateTime startDate = GetStartDateFromDB(...);
txtStartDate.Text = FormatLocalDate(startDate);
...
}
else
{
// To save a date-time value, convert it from local
// time to GMT (UTC).
DateTime tempDate = DateTime.Parse(txtStartDate.Text);
DateTime startDate = ConvertLocalTimeToUtc(tempDate);
SaveStartDateInDB(startDate, ...);
...
}
}
...
}
Если вам нужно больше подробностей, ознакомьтесь со статьей Время: локализация времени в приложениях ASP.NET (извините, но у меня нет прямой ссылки на статью на сайте издателя, поскольку asp.netPRO ограничивает доступ только для платных подписчиков, хотя есть ссылки на копии в формате PDF). Я хотел бы опубликовать образец из статьи, но я не хочу нарушать авторские права; тем не менее, вот проект по созданию вспомогательной библиотеки , которая имеет всю необходимую функциональность и документацию (просто игнорируйте то, что вам не нужно).
ОБНОВЛЕНИЕ: статья была размещена в сети с примером проекта новым издателем здесь .