Как посчитать разницу между датами в C#: число дней

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

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

Начать курс

Сколько дней прошло? Решаем извечную задачу на C#

Представьте: вы пишете приложение для учёта отпусков, планировщик задач или просто хотите узнать, сколько дней осталось до Нового года. И тут встаёт классический вопрос: «Как вычислить разницу между двумя датами в C#?». Этот запрос — один из самых популярных на Stack Overflow, и не зря. Работа с датами — база, которую нужно знать каждому разработчику.

В этой статье мы не просто дадим сухой ответ. Мы разберём всё на живых примерах, покажем подводные камни и научим вас получать количество дней (и не только) между любыми двумя моментами времени. Поехали!

Самый простой способ: вычитаем одну дату из другой

В C# для работы с датами и временем существует мощная структура DateTime. Главный секрет в том, что если вычесть один объект DateTime из другого, вы получите не число, а специальный объект — TimeSpan. Он и хранит в себе разницу.

Базовый пример: разница в днях между двумя конкретными датами

Допустим, вы хотите узнать, сколько дней прошло между 1 марта 2024 года и 10 мая 2024 года.

using System;

class Program
{
    static void Main()
    {
        // Создаём две даты
        DateTime startDate = new DateTime(2024, 3, 1);
        DateTime endDate = new DateTime(2024, 5, 10);

        // Вычисляем разницу
        TimeSpan difference = endDate - startDate;

        // Получаем количество целых дней
        int days = difference.Days;

        Console.WriteLine($"Разница в днях: {days}");
        // Вывод: Разница в днях: 70
    }
}

Всё просто, не правда ли? Оператор - перегружен для DateTime и возвращает TimeSpan. Свойство .Days возвращает целое количество дней (без учёта часов, минут и секунд).

Считаем разницу с «сегодня»

Часто нужно посчитать, сколько дней прошло от какого-то события до текущего момента. Для этого используем DateTime.Now или DateTime.Today.

DateTime today = DateTime.Today; // Только дата, время 00:00
DateTime someDay = new DateTime(2025, 1, 1); // 1 января 2025

TimeSpan diff = someDay - today;

Console.WriteLine($"До Нового года осталось: {diff.Days} дней");

Обратите внимание: DateTime.Today возвращает текущую дату с временем, установленным на 00:00:00. Это удобно, если вам не важны часы и минуты.

А если нужно больше, чем просто дни?

Структура TimeSpan — это не только .Days. У неё есть и другие полезные свойства, которые пригодятся, если вы решите расширить функционал.

  • .Days — количество целых дней.
  • .Hours — часы (от 0 до 23).
  • .Minutes — минуты.
  • .Seconds — секунды.
  • .TotalDays — общее количество дней в виде дробного числа (например, 70.5).
  • .TotalHours — общее количество часов.

Пример с TotalDays

Представьте, что разница между датами составляет ровно 36 часов. Свойство .Days покажет 1 (потому что это один целый день и 12 часов). А .TotalDays покажет 1.5.

DateTime start = new DateTime(2024, 1, 1, 0, 0, 0);
DateTime end = new DateTime(2024, 1, 2, 12, 0, 0); // 1 января + 1 день и 12 часов

TimeSpan span = end - start;

Console.WriteLine($"Дней (целых): {span.Days}");       // 1
Console.WriteLine($"Всего дней: {span.TotalDays}");    // 1.5

Если ваша задача — просто узнать количество полных суток, используйте .Days. Если нужно точное значение с долями — берите .TotalDays.

Важный нюанс: что будет, если дата начала больше даты конца?

Вычитание работает в обе стороны. Если вы вычтете большую дату из меньшей, TimeSpan будет отрицательным. Свойство .Days вернёт отрицательное число.

DateTime early = new DateTime(2024, 5, 10);
DateTime late = new DateTime(2024, 3, 1);

TimeSpan negativeDiff = early - late; // Наоборот
Console.WriteLine(negativeDiff.Days); // Вывод: -70

Чтобы избежать путаницы, часто используют модуль разницы. Вот простой способ:

int daysDifference = Math.Abs((endDate - startDate).Days);
Console.WriteLine($"Модуль разницы: {daysDifference}"); // Всегда положительное

Метод Subtract(): альтернативный вариант

Вместо оператора - можно использовать метод Subtract(). Результат будет абсолютно тем же самым. Это вопрос стиля и читаемости кода.

DateTime start = new DateTime(2024, 6, 1);
DateTime end = new DateTime(2024, 12, 31);

// Используем метод
TimeSpan span = end.Subtract(start);

Console.WriteLine($"Дней до конца года: {span.Days}");

Лично я предпочитаю оператор - — он короче и интуитивно понятен. Но в крупных проектах вы можете встретить и Subtract. Выбирайте то, что удобнее вашей команде.

Реальная задача с Stack Overflow: «Посчитать возраст в днях»

Один из самых частых вопросов на форуме — как подсчитать возраст человека или срок службы устройства в днях. Решение всё то же самое.

DateTime birthDate = new DateTime(1990, 4, 15);
DateTime today = DateTime.Today;

TimeSpan ageInDays = today - birthDate;

Console.WriteLine($"Ваш возраст в днях: {ageInDays.Days}");

Но будьте внимательны! Этот способ не учитывает високосные секунды и переход на летнее время. Для подавляющего большинства бизнес-задач точности DateTime более чем достаточно. Если же вам нужна супер-точность для научных расчётов, стоит обратить внимание на DateTimeOffset и работу с часовыми поясами.

Сравнение дат: какая из них больше?

Иногда нужно не просто вычислить разницу, а понять, какая дата раньше. Для этого можно использовать операторы сравнения.

DateTime date1 = new DateTime(2024, 7, 1);
DateTime date2 = new DateTime(2024, 8, 1);

if (date1 < date2)
{
    Console.WriteLine("date1 раньше, чем date2");
}
else if (date1 > date2)
{
    Console.WriteLine("date1 позже, чем date2");
}
else
{
    Console.WriteLine("Да                

Блоги

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