Как преобразовать DateTime в строку формата "ГГГГММДДЧЧММСС" в C#?
Почему ваш код не работает и как исправить
Ваша ошибка — классическая для новичков. Вы используете неправильные спецификаторы формата. В C# метод ToString(string format) чувствителен к регистру и использует специальные токены, а не просто буквы "Y", "M", "D" и т.д. Когда вы пишете "YYYYMMDDHHMMSS", компилятор воспринимает каждую букву как отдельный символ, который не является распознанным спецификатором, поэтому они просто выводятся как есть.
Правильное решение
Вот корректный код для вашей задачи:
DateTime now = DateTime.Now;
string result = now.ToString("yyyyMMddHHmmss");
Console.WriteLine(result); // Выведет, например: 20250305143045
Разбор спецификаторов формата
Давайте разберём каждый символ:
- yyyy — год из 4 цифр (2025). Важно: маленькие буквы!
YYYYне работает. - MM — месяц из 2 цифр (03). Заглавные буквы!
mm— это минуты. - dd — день из 2 цифр (05). Маленькие буквы.
- HH — часы в 24-часовом формате (14). Заглавные!
hh— это 12-часовой формат. - mm — минуты из 2 цифр (30). Маленькие буквы.
- ss — секунды из 2 цифр (45). Маленькие буквы.
Обратите внимание: порядок спецификаторов в строке формата должен точно соответствовать тому, что вы хотите получить. В нашем случае — год, месяц, день, часы, минуты, секунды — всё слитно.
Дополнительные примеры
Если вам нужно добавить разделители, это делается так:
string withDashes = now.ToString("yyyy-MM-dd"); // 2025-03-05
string withTime = now.ToString("yyyy-MM-dd HH:mm:ss"); // 2025-03-05 14:30:45
string custom = now.ToString("dd.MM.yyyy"); // 05.03.2025
Работа с UTC
Если вам нужно универсальное время, используйте DateTime.UtcNow:
string utcResult = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
Полезные советы
- Всегда проверяйте регистр:
MM(месяц) vsmm(минуты) — частая ошибка. - Для 12-часового формата используйте
hhи добавьтеttдля AM/PM:"yyyy-MM-dd hh:mm:ss tt". - Если вы работаете с базами данных или сериализацией, рассмотрите использование
DateTimeOffsetдля сохранения часового пояса. - Для производительности в циклах используйте
DateTime.Now.ToString(format, CultureInfo.InvariantCulture), чтобы избежать проблем с локалью.
Теперь ваш код будет работать правильно. Запомните эти спецификаторы — они пригодятся вам постоянно!
<<Альтернативный подход: ручное форматирование
Иногда полезно понимать, как работает форматирование "под капотом". Вы можете собрать строку вручную, используя отдельные компоненты DateTime:
DateTime now = DateTime.Now;
string result = $"{now.Year:D4}{now.Month:D2}{now.Day:D2}{now.Hour:D2}{now.Minute:D2}{now.Second:D2}";
Console.WriteLine(result); // 20250305143045
Здесь :D4 и :D2 — это спецификаторы десятичного формата, которые дополняют число нулями до нужной длины. Этот метод более явный и может быть понятнее новичкам, так как вы видите каждый компонент отдельно.
Когда это может пригодиться?
- Если вам нужно изменить порядок частей даты (например, сначала месяц, потом день).
- Если вы работаете с нестандартными форматами, которые не поддерживаются стандартными спецификаторами.
- Для образовательных целей — чтобы лучше понять структуру объекта
DateTime.
Однако для реальных проектов рекомендую использовать первый метод (через ToString), так как он короче, читаемее и менее подвержен ошибкам. Ручное форматирование увеличивает шанс опечатки и усложняет поддержку кода.