Коварный символ ‘/’ в custom формате даты

    • .NET
    • C#
    • DateTime
    • Custom Format
    • CultureInfo
  • modified:
  • reading: 1 minutes

Вопрос, какую директорию создаст этот код?

string sole = DateTime.Today.ToString("yyyy/MM/dd");
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, sole);
if (!Directory.Exists(path))
    Directory.CreateDirectory(path);

Вчера для меня было шоком, что, вроде, логично ожидать директорию вроде “…/2010/08/29”,  а я получил “…/2010.08.29”. Запускаем этот код:

CultureInfo[] cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures);
 foreach (var cultureInfo in cultureInfos)
{
    Thread.CurrentThread.CurrentCulture = cultureInfo;
    Thread.CurrentThread.CurrentUICulture = cultureInfo;
     string sole = DateTime.Today.ToString("yyyy/MM/dd");
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, sole);
 
    Console.WriteLine(path);
}
 
Console.ReadKey();

И смотрим:

Console

В общем,  раньше не встречался с этой фичей, а оказывается - это специальный символ в custom формате, который подставляется на значение из DateTimeFormatInfo.DateSeparator (такой же есть и для времени). Как хорошо, что у нас разделитель точка, а вот другие страны мучаются и не понимают, почему их формат “dd/MM/yyyy” не работает, во время я осознал проблему и подсказал об этой фиче.

Все мелочи не запомнишь, и многое просто проскальзывает, .NET расширяется с каждым годом, и даже базовые вещи уже не все помнишь. Вы, кстати, знали об этой фиче? Были ли подобные неожиданные встречи?

See Also