Форматирование DateTime без переопределения CultureInfo в C # - PullRequest
1 голос
/ 13 марта 2012

Как в C # использовать строки формата DateTime для управления отображением частей даты и в то же время не переопределять CultureInfo?

System.Globalization.CultureInfo cultureInfoUS = new System.Globalization.CultureInfo("en-US", false);
System.Globalization.CultureInfo cultureInfoGerman = new System.Globalization.CultureInfo("de-DE", false);

System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfoUS;
DateTime date = DateTime.Parse("03-13-2012 01:30:00 PM");

Console.WriteLine(date.ToString(cultureInfoGerman));
//produces 13.03.2012 13:30:00
Console.WriteLine(date.ToString("MM/dd/yyyy", cultureInfoGerman));
//produces 03.13.2012 but should be 13.03.2012

System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfoGerman;
Console.WriteLine(date.ToShortTimeString());
//produces: 13:30
Console.WriteLine(date.ToString("h:mm tt", cultureInfoGerman));
//produces: 1:30 but should be 13:30
Console.WriteLine(date.ToString("h:mm tt", cultureInfoUS));
//produces: 1:30 PM

Вы можете увидеть комментарии в приведенном выше коде. Выходные данные частично корректируются в CultureInfo, но не полностью.

Кроме того, методы ToShortDateString и ToShortTimeString не принимают IProvider и поэтому должны полагаться на информацию о культуре текущего потока. Это иллюстрируется первым примером выше. Ожидаете ли вы, что вам следует изменить текущую культуру, позвонить по номеру ToShortDateString и затем вернуть нить обратно к исходной культуре?

1 Ответ

0 голосов
/ 13 марта 2012

Я не понимаю комментарии в вашем коде - используемые вами спецификаторы формата даты / времени ведут себя именно так, как я и ожидал.Почему вы ожидаете, что "MM / dd / yyyy" поставит день на первое место?

Если вам нужен собственный формат, основанный на шаблоне, используемом в данной культуре, вы можете создать его, взглянув на DateTimeFormatInfo.ShortDatePattern, DateTimeFormatInfo.ShortTimePattern и т. Д. Например, если вам нужен пользовательский формат с днем ​​недели, за которым следует короткое время, зависящее от культуры, вы можете использовать:

string format = "dddd " + culture.DateTimeFormat.ShortTimePattern;
Console.WriteLine(DateTime.Now.ToString(format, culture);

Является ли ожидание того, чтоВы должны изменить текущую культуру, вызвать ToShortDateString и затем вернуть нить обратно в исходную культуру?

Нет, вы должны использовать стандартную строку формата даты / времени , если хотитечто-то отличное от текущей культуры:

date.ToString("d", culture); // short date
date.ToString("t", culture); // short time
...