Пользовательский формат даты в .NET - PullRequest
7 голосов
/ 09 января 2012

В .NET большинство стандартных строк, используемых для форматирования значения DateTime, учитывают культуру, например, строка формата ShortDatePattern ("d") меняет порядок частей года / месяца / дня в зависимости от текущего культура:

6/15/2009 1:45:30 PM -> 6/15/2009 (en-US)
6/15/2009 1:45:30 PM -> 15/06/2009 (fr-FR)
6/15/2009 1:45:30 PM -> 15.06.2009 (de-DE)

Мне нужно нечто подобное для формата даты, содержащего только месяц и день:

6/15/2009 1:45:30 PM -> 6/15 (en-US)
6/15/2009 1:45:30 PM -> 15/06 (fr-FR)
6/15/2009 1:45:30 PM -> 15.06. (de-DE)

Используя, например, строка пользовательского формата "MM / dd" не работает; он неправильно отображает «01.11» для 11 января в немецкой культуре, когда я хочу, чтобы он отображал «11.01».

Как мне создать строку произвольного формата, учитывающую порядок частей даты?

Ответы [ 2 ]

3 голосов
/ 09 января 2012

При использовании строки формата custom вы указываете именно те детали, которые вам нужны и где в строке они должны быть. Это именно то, что происходит.

Строка формата, которая у вас есть , уже с учетом культурных особенностей, поскольку заполнитель разделителя даты (/) действительно выводит правильный символ - ..

Помимо создания различных строк нестандартного формата, подходящих для разных культур, больше ничего не поделаешь.

Это может быть помещено в файл ресурсов для интернационализации или храниться, например, в словаре.

2 голосов
/ 09 января 2012

Предполагая, что все переданные культуры будут иметь ShortDatePattern, который содержит M или MM и d или dd в некотором порядке с каким-то разделителем (я не могу думать об исключении для григорианского календаря,но я могу ошибаться) тогда будет работать следующее:

private static string FindMonthDayOnly(System.Globalization.CultureInfo ci)
{
  string shortPattern = ci.DateTimeFormat.ShortDatePattern;
  while(shortPattern[0] != 'd' && shortPattern[0] != 'M')
  {
    shortPattern = shortPattern.Substring(1);
    if(shortPattern.Length == 0)
      return ci.DateTimeFormat.ShortDatePattern;
  }
  while(shortPattern[shortPattern.Length - 1] != 'd' && shortPattern[shortPattern.Length - 1] != 'M')
  {
    shortPattern = shortPattern.Substring(0, shortPattern.Length - 1);
    if(shortPattern.Length == 0)
      return ci.DateTimeFormat.ShortDatePattern;
  }
  return shortPattern;
}

Если предположение очень сильно не соответствует, тогда оно вернется к ShortDatePattern, хотя может также отображаться толькодата или только месяц.

Неправильное включение, включая разделители в конце или другие индикаторы, когда это необходимо.Например, он преобразует стандартный формат (yyyy-MM-dd) в MM-dd вместо --MM-dd, который является стандартным форматом для комбинаций месяца и дня без года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...