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

У меня есть приложение, в котором все DateTime всегда являются временем сервера. То есть один часовой пояс. Идея состоит в том, чтобы сделать приложение совместимым во всем мире. Первым шагом является преобразование всех сохраненных значений DateTime в базе данных в формат UTC, это не проблема. Второй шаг — принять часовой пояс для пользователя (на основе бизнес-логики) и использовать его по умолчанию для отображения и анализа пользовательского ввода. Кроме того, было бы неплохо, если бы такие методы, как DateTime.Now и другие вызовы методов, которые создают даты и время без явной информации о часовом поясе/регионе, также предполагали бы этот часовой пояс/регион.

Идея состоит в том, чтобы принять часовой пояс для пользователя из базы данных. У меня есть пользователь и его часовой пояс, это не проблема.
Проблема в логике представления. Во всем коде есть методы DateTime.now, преобразование всех этих методов требует большой работы.
Чтобы избежать этого, мне нужна глобальная настройка часового пояса, где DateTime знает, какой сейчас часовой пояс. Желательно на родовое место.

class business logic 

InitializeCulture() 
 set time zone for user 
end function 

end class

class presentation logic  

sample()
 TimeOfTheCurrentUser = DateTime.now  
end function

end class

person chrisdenarend    schedule 14.07.2011    source источник
comment
Какой у вас вопрос и какой язык/фреймворк вы используете?   -  person Mat    schedule 14.07.2011
comment
Вопрос: как можно выполнить второй шаг. Второй шаг — принять часовой пояс для пользователя (на основе бизнес-логики) и использовать его по умолчанию для отображения и анализа пользовательского ввода. Кроме того, было бы неплохо, если бы такие методы, как DateTime.Now и другие вызовы методов, которые создают даты и время без явной информации о часовом поясе/регионе, также предполагали бы этот часовой пояс/регион. Язык/фреймворк: VB .NET 3.5   -  person chrisdenarend    schedule 14.07.2011
comment
Связанный вопрос: stackoverflow.com/ вопросы/2532729/   -  person Oded    schedule 14.07.2011


Ответы (1)


Если вы ищете передовой опыт для обработки часовых поясов в (более или менее) корпоративном приложении, я могу поделиться проверенным:

  1. Храните всю информацию, связанную с датой и временем, в формате UTC. Хранение его как местного времени (на сервере или где-либо еще) всегда сопряжено с риском того, что кто-то, где-нибудь, когда-нибудь забудет преобразовать их, и результаты будут далеко не идеальными. Конечно, это означает, что даты и время должны быть созданы с помощью DateTime.UtcNow или с правильным выбором DateTimeKind (это также относится к синтаксическому анализу).

  2. Очевидно, вам нужно преобразовать часовой пояс, прежде чем отображать DateTime для конечного пользователя. И вы наверняка понимаете, что вам нужно получить эту информацию из какого-то источника (отсюда и вопрос). Это где-то может быть на стороне клиента (что будет особенно хорошо работать с толстым клиентом и не так хорошо с JavaScript тонкого клиента), но также может быть профилем пользователя. Если в вашем приложении есть профили пользователей, я определенно рекомендую разрешить пользователю выбирать предпочтительный часовой пояс. Другие настройки, связанные с g11n, могут быть предпочтительными культурой для электронной почты или предпочитаемым языком. Все эти настройки должны быть обнаружены и предварительно выбраны (чтобы пользователю не приходилось думать или, что более важно, слишком много нажимать).

  3. Чтобы преобразовать классы DateTime в местное время в другом часовом поясе, вы должны использовать TimeZoneInfo< /а> класс. Есть несколько способов сделать это...

Если вы реализуете этот метод, вы можете столкнуться с проблемой с именами часовых поясов - они находятся в культуре сервера, поэтому вам нужно будет экстернализовать (переместить в файл ресурсов) то, что показывает вам DisplayName TimeZoneInfo, и позволить переводчикам делать свою работу.

Также коротко о том, что я имел в виду под определением часового пояса.
В толстом клиенте это можно сделать, просто прочитав местный часовой пояс:

TimeZoneInfo currentTimeZone = TimeZoneInfo.Local;

С JavaScript (тонкий клиент) это не так просто. Единственное, что вы можете получить, это смещение часового пояса (которое может варьироваться в зависимости от даты и времени) на заданную дату:

var date = new Date();
var offset = date.getTimezoneOffset(); // GMT offset in minutes
person Paweł Dyda    schedule 14.07.2011