Формат c# datetime без года

Есть ли возможность отформатировать DateTime без года и с месяцем в числовом представлении, которое интернационализировано?

например новый DateTime (2018, 8, 10) (сегодня)

С одной стороны, у нас есть «d» для 10.08.2018 (немецкий) или 2018/08/10 (японский).

С другой стороны, у нас есть "M", что дает нам 10. August (немецкий) или August 10 (американский английский).

Но я хочу 10.08. (немецкий), 08/10 (японский), 8/10 (американский английский), 10/08 (британский английский).

@mjwills спасибо, но, насколько я понимаю, они не интернационализируются (это слово?) Я должен сам отдавать порядок и разделители.

Dominik G 10.08.2018 14:39

Спасибо, я тоже, поэтому и спросил.

Dominik G 10.08.2018 14:50

См. Также DateTimeFormatInfo - нет такого свойства, как DayBeforeMonth, которое вы могли бы использовать. Все подобные шаблоны устанавливаются индивидуально. - То, что вы делаете мог, - это, например, возьмите ShortDatePattern и сами проверьте, находится ли d перед M, а затем подготовьте собственный формат. Обратите внимание, что "/" должен автоматически заменяться DateSeparator, специфичным для культуры.

Corak 10.08.2018 14:59

Нигде (afaik) не сохраняется, если шаблон день-месяц должен заканчиваться разделителем, как вы ожидаете для дат немецкого языка (10.08.).

Tim Schmelter 10.08.2018 15:56

Похоже, мне нужно либо построить для этого некоторую сложную логику, либо нужно сказать дизайнерам, что им нужно планировать больше места для «M» или «d».

Dominik G 10.08.2018 15:59

Я не вижу ни в одном списке форматов даты, что разделитель необходим, если это не точка, поэтому логика (возможно, не такая сложная) была бы похожа на комментарий Коракса. Замените yyyy и окружающие разделители, если они установлены. добавьте его снова в конце.

Dominik G 10.08.2018 16:08

Краткая дата без года, вероятно, недоступна по дизайну, как говорит Томас Г.: вероятно, не существует определенного соглашения для отображения только части месяца и дня даты как в виде чисел

OneWorld 10.11.2020 08:23
6
8
1 941
1

Ответы 1

Может быть, вы могли бы взять ShortDatePattern из DateTimeFormatInfo и убрать yyyy?

Вам нужно проявить немного творчества, чтобы удалить разделитель вместе с ним.

Заменить цепочку

.Replace(DateFormatInfo.DateSeparator+"yyyy")
.Replace("yyyy"+DateFormatInfo.DateSeparator)

Regex может помочь ^y+[^0-9A-Za-z]+|[^0-9A-Za-z]+y+$

  string[]  cultures = { "en-US", "ja-JP", "fr-FR" };
  DateTime date1 = new DateTime(2011, 5, 1);

  Console.WriteLine(" {0,7} {1,19} {2,10}\n", "CULTURE", "PROPERTY VALUE", "DATE");

  foreach (var culture in cultures) {
     DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture(culture).DateTimeFormat;
     Console.WriteLine(" {0,7} {1,19} {2,10}", culture, 
                       dtfi.ShortDatePattern, 
                       date1.ToString("d", dtfi));
  }

CULTURE      PROPERTY VALUE       
en-US            M/d/yyyy  
ja-JP          yyyy/MM/dd 
fr-FR          dd/MM/yyyy 

От: https://docs.microsoft.com/en-us/dotnet/api/system.globalization.datetimeformatinfo.shortdatepattern?view=netframework-4.7.2

Как вырезать год? Потому что вам нужно было знать, появится ли разделитель даты до или после года

Tim Schmelter 10.08.2018 14:53

Хм ... dtfi.ShortDatePattern.Replace("yyyy", "").Trim("/") и снова добавить "/" в конце, если DateSeparator - это "."? - хрупкое и потенциально подверженное ошибкам, но может быть «достаточно хорошим» для стандартных случаев использования ...

Corak 10.08.2018 15:05

добавлено возможное Regex, вам, конечно, придется протестировать

Richard Hubley 10.08.2018 15:05
DateFormatInfo.DateSeparator можно использовать для замены .Replace(DateFormatInfo.DateSeparator+"yyyy").Replace("yyyy"‌​+DateFormatInfo.Date‌​Separator)
Richard Hubley 10.08.2018 15:07

Я только что попробовал, решение @Corak не работает для DateSeparator "-" или "", но это должно быть исправлено с помощью "(yyyy [/.\-]) | ([/.\- providedyyyy)" Regex

Dominik G 10.08.2018 15:08

@RichardHubley - Имейте в виду, что, например, в культуре "de-DE" результат должен быть "10.08.".

Corak 10.08.2018 15:09

@Corak интересно, я предположил, что это ошибка копирования и вставки. DateTime кажется одной из самых сложных вещей в программировании

Richard Hubley 10.08.2018 15:16

... и сербский ("sr"), боснийский ("bs") или хорватский ("hr") с ShortDatePattern, такой как "d.M.yyyy." (точка за годом), также нуждаются в особом обращении - и, вероятно, в нескольких других специальных форматах. - @RichardHubley - В самом деле ... просто чтение размышлений Джона Скитса о Noda Time вызывает у меня мурашки ...

Corak 10.08.2018 15:18
var formats = CultureInfo.GetCultures(CultureTypes.AllCultures).GroupBy(c => c.DateTimeFormat.ShortDatePattern); foreach (var format in formats.OrderByDescending(f => f.Count())) { Console.WriteLine($"{format.Key} - ({format.Count()} cultures)"); }
Corak 10.08.2018 15:27

Другие вопросы по теме