Похоже, что поведение является заданным, и я думаю, что оно работает таким образом, чтобы быть совместимым с другими параметрами форматирования строк.
Возьмите следующий пример:
//Convert DateTime to string
string dateFormat = "d/MM/yyyy";
string date1 = new DateTime(2008, 10, 5).ToString(dateFormat);
string date2 = new DateTime(2008, 10, 12).ToString(dateFormat);
//Convert back to DateTime
DateTime x1, x2;
DateTime.TryParseExact(date1, dateFormat, null, System.Globalization.DateTimeStyles.None, out x1);
DateTime.TryParseExact(date2, dateFormat, null, System.Globalization.DateTimeStyles.None, out x2);
Console.WriteLine(x1);
Console.WriteLine(x2);
В первой части, ToString()
выводит двузначный день для 12 октября, потому что не имеет смысла просто записывать однозначный день (и какую цифру он выберет, 1 или 2? ). Таким образом, поскольку "d" представляет один ИЛИ два цифр дней при преобразовании в строку, при преобразовании обратно в DateTime
она должна работать аналогичным образом. Если этого не произойдет, преобразование обратно в DateTime
в TryParseExact
в моем примере завершится неудачей, и это определенно не будет ожидаемым поведением.
Я бы сказал, что если вам действительно нужно точно соответствовать формату объявления / MM / гггг, вы можете использовать регулярное выражение для проверки строки и затем передать ее через Parse
, TryParse
или TryParseExact
(в зависимости от насколько хорошо ваше регулярное выражение, поскольку оно должно обрабатывать високосные годы, 30/31 день и т. д., если вы хотите использовать Parse
).