Работа с датами и временем в C#: полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в работу с датами и временем в C#

Работа с датами и временем — одна из фундаментальных задач в разработке программного обеспечения. Будь то логирование событий, расчет сроков, создание отчетов или работа с базами данных — умение правильно управлять временными данными критически важно. В C# (платформа .NET) для этих целей существует мощный и гибкий набор инструментов, включающий структуры DateTime, TimeSpan и DateTimeOffset.

В этой статье мы подробно разберем все ключевые аспекты работы с датами и временем в C#. Вы узнаете, как создавать, форматировать, сравнивать и манипулировать временными данными, а также познакомитесь с лучшими практиками, которые помогут избежать распространенных ошибок.

Основные структуры: DateTime, TimeSpan и DateTimeOffset

Структура DateTime

DateTime — это основная структура для представления момента времени (дата + время). Она может представлять значения от 01.01.0001 до 31.12.9999.

Создание объекта DateTime:

// Текущая дата и время
DateTime now = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;

// Конкретная дата и время
DateTime specificDate = new DateTime(2025, 3, 15, 14, 30, 0); // 15 марта 2025, 14:30:00

// Парсинг из строки
DateTime parsedDate = DateTime.Parse("2025-03-15");

// Использование TryParse для безопасного парсинга
if (DateTime.TryParse("2025-03-15", out DateTime result))
{
    Console.WriteLine($"Успешно распарсено: {result}");
}

Основные свойства и методы:

  • Date — возвращает только дату (время = 00:00:00)
  • Year, Month, Day, Hour, Minute, Second — отдельные компоненты
  • DayOfWeek — день недели (enum)
  • AddDays(), AddMonths(), AddYears() — арифметика с датами
  • AddHours(), AddMinutes(), AddSeconds() — арифметика со временем

Структура TimeSpan

TimeSpan представляет интервал времени (промежуток между двумя моментами). Это не дата, а именно длительность.

// Создание TimeSpan
TimeSpan interval = new TimeSpan(2, 15, 30); // 2 часа, 15 минут, 30 секунд

// Разница между двумя датами
DateTime start = new DateTime(2025, 1, 1);
DateTime end = new DateTime(2025, 1, 10);
TimeSpan difference = end - start; // 9 дней

// Свойства TimeSpan
Console.WriteLine($"Дни: {difference.Days}");          // 9
Console.WriteLine($"Всего часов: {difference.TotalHours}"); // 216
Console.WriteLine($"Всего минут: {difference.TotalMinutes}"); // 12960

// Арифметика с TimeSpan
TimeSpan workDay = new TimeSpan(8, 0, 0); // 8 часов
TimeSpan breakTime = new TimeSpan(1, 0, 0); // 1 час
TimeSpan actualWork = workDay - breakTime; // 7 часов

Структура DateTimeOffset

DateTimeOffset — это улучшенная версия DateTime, которая учитывает смещение относительно UTC. Это критически важно для приложений, работающих с пользователями из разных часовых поясов.

// Текущее время с учетом часового пояса
DateTimeOffset nowOffset = DateTimeOffset.Now;

// Создание с указанием смещения
DateTimeOffset withOffset = new DateTimeOffset(2025, 3, 15, 14, 0, 0, TimeSpan.FromHours(3));

// Конвертация между часовыми поясами
DateTimeOffset utc = withOffset.ToUniversalTime();
DateTimeOffset local = withOffset.ToLocalTime();

// Получение смещения
Console.WriteLine($"Смещение: {withOffset.Offset}"); // +03:00

Когда использовать DateTimeOffset вместо DateTime? Если ваше приложение работает с пользователями из разных часовых поясов или хранит данные в UTC, используйте DateTimeOffset. Это предотвратит путаницу с переводом часов.

Форматирование и парсинг дат

Стандартные форматы

В C# существует множество стандартных спецификаторов формата для вывода дат:

DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("d"));   // 15.03.2025 (короткая дата)
Console.WriteLine(now.ToString("D"));   // 15 марта 2025 г. (полная дата)
Console.WriteLine(now.ToString("t"));   // 14:30 (короткое время)
Console.WriteLine(now.ToString("T"));   // 14:30:00 (полное время)
Console.WriteLine(now.ToString("f"));   // 15 марта 2025 г. 14:30
Console.WriteLine(now.ToString("F"));   // 15 марта 2025 г. 14:30:00
Console.WriteLine(now.ToString("g"));   // 15.03.2025 14:30
Console.WriteLine(now.ToString("G"));   // 15.03.2025 14:30:00
Console.WriteLine(now.ToString("o"));   // 2025-03-15T14:30:00.0000000 (ISO 8601)

Пользовательские форматы

Вы можете создавать собственные шаблоны форматирования:

DateTime now = DateTime.Now;

// Пользовательский формат
string customFormat = now.ToString("dd.MM.yyyy HH:mm");
Console.WriteLine(customFormat); // 15.03.2025 14:30

// Другие примеры
Console.WriteLine(now.ToString("yyyy-MM-dd"));        // 2025-03-15
Console.WriteLine(now.ToString("dddd, MMMM yyyy"));   // суббота, марта 2025
Console.WriteLine(now.ToString("HH:mm:ss.fff"));      // 14:30:00.123

Таблица популярных спецификаторов:

  • yyyy — год (4 цифры)
  • MM — месяц (01-12)
  • dd — день (01-31)
  • HH — часы в 24-часовом формате (00-23)
  • mm — минуты (00-59)
  • ss — секунды (00-59)
  • fff — миллисекунды
  • ddd —

Блоги

Рекомендаций по книгам