Сохраните дату и время.Теперь между переключающимися культурами

#asp.net-mvc-3 #datetime #.net-4.0 #localization

#asp.net-mvc-3 #дата и время #.net-4.0 #локализация

Вопрос:

У меня есть asp.net приложение mvc. Он многоязычный и записывает некоторые значения в cookie. Проблема возникает, если текущая культура (язык) приложения и значение даты и времени, хранящиеся в файле cookie, имеют разные форматы. Поэтому я решил сохранять и извлекать значения даты и времени только в английской культуре. Но я столкнулся с проблемой.

  var currentCulture = Thread.CurrentThread.CurrentCulture; //for example, ru-RU
 var currentUICulture = Thread.CurrentThread.CurrentUICulture;

 var englishCulture = CultureInfo.GetCultureInfo("en-US");
 Thread.CurrentThread.CurrentCulture = englishCulture;
 Thread.CurrentThread.CurrentUICulture = englishCulture;

 var dateTime = DateTime.Now;  //  10/22/2011 9:56:15 AM (in English)


 Thread.CurrentThread.CurrentCulture = currentCulture;
 Thread.CurrentThread.CurrentUICulture = currentUICulture;

 return dateTime;              //   22.10.2011 9:56:15 (in Russian). But why?
 

Я хочу вернуть дату и время.Теперь в английской культуре.

Ответ №1:

Информация о DateTime культуре не сохраняется. Это когда вы вызываете ToString , что культура имеет значение. Если вы хотите отформатировать его с определенной культурой, прежде чем возвращать его, вам нужно вернуть его в виде строки.

 return DateTime.Now.ToString(cultureInfo);
 

Возможно, вам следует вернуть его как a DateTime (и вы, вероятно, захотите использовать DateTime.UtcNow , чтобы он работал в разных часовых поясах) и отформатировать его с использованием инвариантной культуры : CultureInfo.InvariantCulture .

Комментарии:

1. Почему значение локальной переменной «DateTime» было изменено?

2. Ошибка.. что? Он не изменился — он просто отформатирован по-другому. Вы имеете в виду «почему изменяется строковое представление даты?» Это потому, что когда ваш отладчик вызывает toString, этот метод использует текущую культуру, и вы изменили это.

3. Возможно ли вернуть структуру DateTime (не string) в en-US-культуре, если текущая культура не является en-US?

4. @Alex Maslakov: Дата-время не хранит культуру. Язык имеет значение только тогда, когда вы форматируете его в строку. Чего вы пытаетесь достичь? Почему бы не использовать инвариантную культуру? Это будет работать одинаково для всех.

5. Пожалуйста, перечитайте ответ Марка: DateTime не содержит информации о культуре. Точка. Но он может содержать информацию о часовом поясе. Что не является культурой. Большинство стран относятся к 1 часовому поясу, но некоторые, включая США, охватывают несколько часовых поясов. Вот почему Марк предлагает использовать DateTime . UtcNow, поскольку это не зависит от местоположения пользователя.