#wpf #silverlight #datetime #converter
#wpf #silverlight #дата и время #конвертеры
Вопрос:
Я собираюсь создать конвертер для перевода даты в пользовательский формат.
Фактически, в одном конвертере у меня есть дата, подобная этой 17/05/2011 00:00:00, которую я хотел бы преобразовать просто в 17/05/2011. Однако язык также должен быть принят во внимание.
В моем примере выше у меня была британская культура, но если пользователь американец, то он должен быть преобразован в 17.05.2011.
По сути, мне также понадобился бы обратный конвертер для обратного преобразования даты независимо от культуры в формат, удобный для базы данных, чтобы сохранить ее универсально и безопасно без недоразумений.
Это была моя первая попытка, которая уже завершилась неудачей:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value == null)
return null;
DateTime date = DateTime.Parse(value.ToString(), culture);
return date;
}
Также удивительно то, что параметр CultureInfo выше равен Us-en, несмотря на то, что все в Windows установлено в Соединенное Королевство. Кстати, я использую этот конвертер для Silverlight 4, возможно, здесь используется другой язык получения… Тем не менее, как ни странно, я получаю ожидание «Строка не была распознана как допустимое DateTime». Я думаю, это связано с моей американской культурой, которая не понимает 17 как месяц. Как мне настроить свой локальный язык в приложении silverlight?
И тогда мне понадобится второй конвертер, чтобы возвращать только время, аналогичное указанному выше. я подумал, что мог бы использовать перегрузку DateTimeStyles.NoCurrentDateDefault для того, чтобы он генерировал только время из дат, правильно?
Большое спасибо за вашу помощь,
Ответ №1:
Настройка языка может быть выполнена в текущем потоке, каждый поток в приложении может быть в другом языке.
http://msdn.microsoft.com/en-us/library/system.threading.thread.currentculture (v = VS.100).aspx
Любопытно, если ваш компьютер находится в en-gb, но ваше приложение находится в en-us, я бы предположил, что приложение явно переведено в этот язык, возможно, с помощью файла конфигурации. Если приложению не задан язык, он использует язык операционной системы.
В ASP.NET веб-приложения, я помню, вы также могли указать культуру в файле конфигурации.
Ваша конечная цель — просто сократить временную часть DateTime
? Если это так, то доступно DateTime.Date
свойство, которое затем можно преобразовать, используя значение по умолчанию.Поддержка сетевого языка.
ConvertBack
Метод может сохранять время как UTC, на DateTime
существуют различные методы для сохранения в UTC. UTC включает информацию о часовом поясе и поставляется в одном формате, удобном для баз данных.
http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx
Хотя, честно говоря, если SQL Server является вашим сервером базы данных, то до тех пор, пока вы храните даты в виде дат, а не строк, опять же, о культуре заботятся за вас.
Комментарии:
1. Привет, Адам, спасибо за твой ответ. Я пробовал date. Дата, однако время в конце все еще присутствует и не обрезается. 17/05/2011 00:00:00 Я мог бы, очевидно, использовать подстроку и вырезать ее сам, но я хотел использовать более чистый способ получения даты без времени.
2. Что касается культуры, я проверил App.config и Web.config и нигде не смог найти культуру, установленную НАМИ. Фактически EF4 установил для своих сервисов значение Culture =neutral. Все еще изучаю это…
3. Если вы хотите преобразовать дату в строку, то вы можете использовать
DateTime.Now.ToShortDateString
. Это соответствует локали.4. Извините за поздний ответ. Я все еще пытаюсь правильно подобрать язык. Язык по-прежнему настроен на US. Как я могу заставить его считывать культуру моего компьютера? Я хотел бы, чтобы это было так, чтобы любой пользователь из любой точки мира видел местный привычный формат дат и времени. Я не хочу применять тот или иной способ. Вы понимаете, что я имею в виду?
5. @Kave привет, я не совсем уверен, почему он продолжает выбирать для тебя другую культуру. Я предполагаю, что это настроено где-то без вашего ведома. Лучше всего опубликовать вопрос именно с этим, и вы получите несколько быстрых ответов.