2013-04-24 4 views
2

Единственное, что я знаю, это то, что DateTime всегда следует хранить в UTC, но при отображении или получении ввода он должен быть зарегистрированным в локальном времени пользователя.DateTime Локализация. Любые стандарты/лучшие практики

Это должно смягчить проблемы с часовым поясом.

Любые стандарты/лучшие практики, когда я должен коснуться минимальной части уже разработанной базы кода?

При получении запроса я могу использовать ModelBinders (Asp.Net MVC). Но что мне следует перехватывать, чтобы модифицировать типы DateTime, а также визуализировать ответ?

Любая помощь будет оценена ....

+0

Мне придется. Существует функция, в которой пользователь взаимодействует, отправляет сообщение и все. И пользователи могут быть разными часовыми поясами. Так что я должен хранить его в UTC и diplay в локальном формате. – sandeep

+0

@AdamHouldsworth switch locales влияет на форматирование строк, но не имеет ничего общего с преобразованием для разных часовых поясов. Если он хочет записать определенный момент времени, то это должно быть либо UTC DateTime, либо DateTimeOffset. В противном случае существует двусмысленность. –

+0

@MattJohnson Извинения, я получал мои провода, скрещенные с чем-то другим. –

ответ

1

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

Таким образом, на вашем базовом контроллере вы можете переопределить выполняемое действие и установить культуру пользователя в потоке. Что-то вроде:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
     if (currentUser != null) //user your user object 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(currentUser.Culture); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(currentUser.Culture); 
     } 
     else 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB"); 
     } 
} 

Тогда всякий раз, когда вы используете ваши DateTime объекты, вы можете использовать ToShortDateString:

string localistedDate = yourDate.ToShortDateString(); 

Или, если вы не хотите, короткий формат, вы можете использовать ToString с вашим собственным формат, проходящий в культуре по потоку

+0

Спасибо! Я собираюсь использовать это и посмотреть, поможет ли это. – sandeep

1

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

В зависимости от вашего сценария вы можете использовать стандартную базу данных часовых поясов IANA/Olson вместо Microsoft Windows. См. the TimeZone tag wiki.

Смежные вопросы