Как сказал xanatos, он рассматривает "d" как стандартную строку формата даты и времени.
Если вы хотите, чтобы пользовательская строка формата даты и времени, состоящая из «d», вам нужно эффективно экранировать ее, чтобы сказать «не рассматривайте это как стандартный шаблон!»
new DateTime(2011, 10, 5).ToString("%d");
Здесь %
- это «переход от стандартной к пользовательской».
Из документации Пользовательские строки формата даты и времени , раздел "Использование отдельных спецификаторов формата":
Пользовательская строка формата даты и времени состоит из двух или более символов. Методы форматирования даты и времени интерпретируют любую односимвольную строку как стандартную строку формата даты и времени. Если они не распознают символ как допустимый спецификатор формата, они генерируют исключение FormatException. Например, строка формата, которая состоит только из спецификатора "h", интерпретируется как стандартная строка формата даты и времени. Однако в данном конкретном случае выдается исключение, поскольку отсутствует стандартный спецификатор формата даты и времени «h».
Чтобы использовать любой из пользовательских спецификаторов формата даты и времени в качестве единственного спецификатора в строке формата (то есть использовать "d", "f", "F", "g", "h", " H "," K "," m "," M "," s "," t "," y "," z ",": "или" / "спецификатор пользовательского формата сам по себе), включают пробел перед или после спецификатора, или включать спецификатор формата в процентах ("%") перед единым пользовательским спецификатором даты и времени.
Например, «% h» интерпретируется как строка пользовательского формата даты и времени, которая отображает часы, представленные текущими значениями даты и времени. Вы также можете использовать строку формата «h» или «h», хотя это включает пробел в строке результата вместе с часом.