Работа с датами и временем в C#: DateTime, TimeSpan и форматирование

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

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

Начать курс

Введение: Почему работа с датами в C# — это важно

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

В этой статье мы подробно разберем основные типы для работы с датами и временем в C#: DateTime, TimeSpan и DateTimeOffset. Вы узнаете, как создавать, изменять, форматировать и сравнивать даты, а также как грамотно работать с временными зонами. Материал будет полезен как начинающим, так и опытным разработчикам, желающим систематизировать свои знания.

Основные типы данных: DateTime, TimeSpan и DateTimeOffset

1. Структура DateTime

DateTime — это основной тип для представления момента времени (дата + время). Он хранит информацию от 1 января 0001 года до 31 декабря 9999 года с точностью до 100 наносекунд (тик).

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

// Текущая дата и время
DateTime now = DateTime.Now;
// Текущая дата и время по UTC
DateTime utcNow = DateTime.UtcNow;
// Конкретная дата
DateTime specificDate = new DateTime(2025, 3, 15);
// Дата и время с точностью до секунды
DateTime specificDateTime = new DateTime(2025, 3, 15, 14, 30, 0);
// Сегодняшняя дата (время = 00:00:00)
DateTime today = DateTime.Today;

2. Структура TimeSpan

TimeSpan представляет собой интервал времени (промежуток). Он не привязан к конкретной дате, а хранит разницу во времени: дни, часы, минуты, секунды и доли секунд.

Создание и использование TimeSpan:

// Создание интервала: 2 дня, 5 часов, 30 минут
TimeSpan interval = new TimeSpan(2, 5, 30, 0);
// Интервал из часов
TimeSpan fromHours = TimeSpan.FromHours(48.5);
// Разница между двумя датами
DateTime start = new DateTime(2025, 1, 1);
DateTime end = new DateTime(2025, 3, 15);
TimeSpan difference = end - start;
Console.WriteLine(difference.Days); // 73

3. Структура DateTimeOffset

DateTimeOffset — это более современная альтернатива DateTime, которая помимо даты и времени хранит смещение относительно UTC (например, +03:00). Это помогает избежать путаницы с часовыми поясами при передаче данных между системами.

// Текущее время со смещением
DateTimeOffset localOffset = DateTimeOffset.Now;
// Время по UTC со смещением +00:00
DateTimeOffset utcOffset = DateTimeOffset.UtcNow;
// Создание с указанием смещения
DateTimeOffset specific = new DateTimeOffset(2025, 3, 15, 12, 0, 0, TimeSpan.FromHours(3));

Основные операции: сложение, вычитание и сравнение

Арифметика с DateTime и TimeSpan

Одним из главных преимуществ C# является удобная арифметика дат. Вы можете легко прибавлять или вычитать дни, месяцы, годы, а также работать с часами и минутами.

DateTime today = DateTime.Today;
// Прибавить 10 дней
DateTime futureDate = today.AddDays(10);
// Прибавить 2 месяца
DateTime futureMonth = today.AddMonths(2);
// Вычесть 1 год
DateTime pastYear = today.AddYears(-1);
// Прибавить 5 часов и 30 минут
DateTime precise = today.AddHours(5).AddMinutes(30);

Работа с TimeSpan:

TimeSpan workDay = new TimeSpan(8, 0, 0); // 8 часов
TimeSpan breakTime = new TimeSpan(0, 45, 0); // 45 минут
TimeSpan totalWork = workDay + breakTime; // 8 часов 45 минут
TimeSpan remaining = workDay - breakTime; // 7 часов 15 минут

Сравнение дат

Для сравнения двух моментов времени используются стандартные операторы сравнения:

DateTime date1 = new DateTime(2025, 1, 1);
DateTime date2 = new DateTime(2025, 6, 15);

if (date1 < date2)
    Console.WriteLine("date1 раньше date2");
else if (date1 == date2)
    Console.WriteLine("даты равны");
else
    Console.WriteLine("date1 позже date2");

// Метод CompareTo возвращает -1, 0 или 1
int result = date1.CompareTo(date2); // -1

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

Форматирование в строку

Метод ToString() с использованием стандартных и пользовательских спецификаторов формата позволяет вывести дату в любом виде.

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

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("dd.MM.yyyy HH:mm:ss")); // 15.03.2025 14:30:00
Console.WriteLine(now.ToString("yyyy-MM-dd"));          // 2025-03-15 (ISO 8601)
Console.WriteLine(now.ToString("dddd, MMMM yyyy"));     // суббота, марта 2025
Console.WriteLine(now.ToString("HH:mm:ss.fff"));        // 14:30:00.000 (с миллисекундами)

Парсинг строки в дату

Для преобразования строки в объект DateTime используются методы Parse, TryParse и ParseExact.

string dateString = "2025-03-15";
DateTime parsedDate = DateTime.Parse(dateString);

// Безопасный парсинг (без исключений)
string invalidDate = "не дата";
if (DateTime.TryParse(invalidDate, out DateTime result))
    Console.WriteLine(result);
else
    Console.WriteLine("Невозможно распарсить строку");

// Точный парси                

Блоги

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