Работа с датами в C# (.NET): встроенные средства и библиотеки

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

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

Начать курс

Работа с датами в C# (.NET): встроенные средства и популярные библиотеки

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

Встроенные типы .NET

Базовый класс System.DateTime предоставляет методы для создания, сравнения, арифметики и форматирования дат. Он поддерживает диапазон от 01.01.0001 до 31.12.9999.

// Создание даты
DateTime now = DateTime.Now;                // локальное время
DateTime utcNow = DateTime.UtcNow;          // UTC
DateTime specific = new DateTime(2025, 3, 15, 14, 30, 0);

// Арифметика
DateTime tomorrow = now.AddDays(1);
TimeSpan diff = tomorrow - now;
Console.WriteLine(diff.TotalHours);         // 24

// Парсинг
string dateStr = "2025-12-31";
DateTime parsed = DateTime.Parse(dateStr, CultureInfo.InvariantCulture);

// Форматирование
Console.WriteLine(now.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30

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

DateTimeOffset nowOffset = DateTimeOffset.Now;
Console.WriteLine(nowOffset.Offset); // +03:00 (зависит от системы)

TimeSpan — для представления интервалов времени. Идеален для измерения длительности операций.

TimeSpan duration = new TimeSpan(2, 15, 30); // 2 часа 15 минут 30 секунд
Console.WriteLine(duration.TotalMinutes);     // 135.5

Библиотека NodaTime

NodaTime — это альтернативная библиотека для работы с датами и временем, созданная Джоном Скитом (автором книг по C#). Она решает многие проблемы DateTime, такие как неоднозначность и отсутствие строгой типизации временных зон.

Установка через NuGet:

dotnet add package NodaTime

Основные типы:

  • Instant — момент времени (аналог Unix timestamp)
  • LocalDateTime — дата+время без привязки к часовому поясу
  • ZonedDateTime — дата+время в конкретном часовом поясе
  • Duration и Period — интервалы (аналог TimeSpan, но Period учитывает календарные единицы)
using NodaTime;

// Текущий момент в UTC
Instant now = SystemClock.Instance.GetCurrentInstant();
Console.WriteLine(now.ToDateTimeUtc()); // можно преобразовать в DateTime

// Работа с часовыми поясами
DateTimeZone tz = DateTimeZoneProviders.Tzdb["Europe/Moscow"];
ZonedDateTime moscowTime = now.InZone(tz);
Console.WriteLine(moscowTime); // 2025-03-15T17:30:00 Europe/Moscow (+03)

// Period — разница в календарных единицах
LocalDate start = new LocalDate(2024, 1, 1);
LocalDate end = new LocalDate(2025, 3, 15);
Period period = Period.Between(start, end);
Console.WriteLine($"Прошло {period.Years} лет, {period.Months} месяцев, {period.Days} дней");
// Прошло 1 лет, 2 месяцев, 14 дней

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

Библиотека Humanizer

Humanizer — это библиотека для «очеловечивания» данных, в том числе дат и интервалов. Она позволяет выводить даты в удобочитаемом виде: «вчера», «через 3 часа», «2 дня назад».

Установка:

dotnet add package Humanizer

Примеры использования:

using Humanizer;

DateTime pastDate = DateTime.UtcNow.AddDays(-2);
Console.WriteLine(pastDate.Humanize()); // "2 days ago"

DateTime futureDate = DateTime.UtcNow.AddHours(5);
Console.WriteLine(futureDate.Humanize()); // "5 hours from now"

// Для TimeSpan
TimeSpan span = new TimeSpan(1, 2, 30, 0);
Console.WriteLine(span.Humanize()); // "1 day, 2 hours, 30 minutes"                    

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