#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, поскольку это не зависит от местоположения пользователя.