outcoldman
outcoldman Denis Gladkikh

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

.NET, C#, DateTime, Custom Format, and CultureInfo

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

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 расширяется с каждым годом, и даже базовые вещи уже не все помнишь. Вы, кстати, знали об этой фиче? Были ли подобные неожиданные встречи?

Have feedback or questions? Looking for consultation?

My expertise: MongoDB, ElasticSearch, Splunk, and other databases. Docker, Kubernetes. Logging, Metrics. Performance, memory leaks.

Send me an email to public@denis.gladkikh.email.

The content on this site represents my own personal opinions and thoughts at the time of posting.

Content licensed under the Creative Commons CC BY 4.0.