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

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

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

Начать курс

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

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

1. Встроенные средства: DateTime, DateOnly, TimeOnly

Базовый класс System.DateTime доступен с первых версий .NET. Он поддерживает:

  • Создание даты: new DateTime(2025, 3, 15)
  • Арифметику: date.AddDays(10), date.AddMonths(-1)
  • Сравнение: date1 > date2
  • Форматирование: date.ToString("yyyy-MM-dd")

Начиная с .NET 6, появились типы DateOnly и TimeOnly — они лишены привязки к часовому поясу и хранят только дату или только время. Это удобно для дней рождения, графиков работы и расписаний.

using System;

DateOnly birthday = new DateOnly(1990, 5, 20);
TimeOnly alarm = new TimeOnly(7, 30);

Console.WriteLine($"Дата: {birthday}, Время: {alarm}");
// Вывод: Дата: 20.05.1990, Время: 07:30

2. TimeSpan — интервалы времени

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

DateTime start = DateTime.Now;
// ... выполнение кода ...
DateTime end = DateTime.Now;

TimeSpan elapsed = end - start;
Console.WriteLine($"Прошло: {elapsed.TotalSeconds} сек.");

3. Noda Time — продвинутая работа с датами

Noda Time (NuGet: NodaTime) — это библиотека от Джона Скита (автора популярной книги по C#). Она решает проблемы DateTime:

  • Чёткое разделение между «моментом во времени» (Instant), «датой в календаре» (LocalDate) и «временем с поясом» (ZonedDateTime).
  • Поддержка календарей (исламский, еврейский, японский).
  • Иммутабельность всех типов.
  • Правильная обработка часовых поясов через базу данных IANA (tzdata).
using NodaTime;

Instant now = SystemClock.Instance.GetCurrentInstant();
DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Moscow"];
ZonedDateTime moscowTime = now.InZone(zone);

Console.WriteLine($"Текущее время в Москве: {moscowTime:yyyy-MM-dd HH:mm}");

// Работа с LocalDate
LocalDate today = LocalDate.FromDateTime(DateTime.Today);
LocalDate nextWeek = today.PlusDays(7);

Noda Time особенно полезна в проектах, где критична точность часовых поясов (логи, бронирования, международные системы).

4. Humanizer — человекочитаемые даты

Humanizer (NuGet: Humanizer.Core) — библиотека для преобразования чисел, дат и времени в естественный язык. Она умеет:

  • Показывать относительное время: "3 минуты назад", "через 2 дня".
  • Склонять названия месяцев и дней недели.
  • Форматировать временные интервалы: "1 час 30 минут".
using Humanizer;

DateTime pastDate = DateTime.UtcNow.AddHours(-5);
Console.WriteLine(pastDate.Humanize()); // "5 часов назад"

TimeSpan span = new TimeSpan(2, 45, 0);
Console.WriteLine(span.Humanize()); // "2 часа 45 минут"

Humanizer поддерживает локализацию (русский язык — Humanizer.Core.ru).

5. FluentDateTime — fluent-интерфейс для DateTime

FluentDateTime (NuGet: FluentDateTime) — добавляет методы-расширения для более лаконичной работы:

using FluentDateTime;

DateTime date = 1.March(2025) + 3.Days() - 2.Hours();
Console.WriteLine(date); // 04.03.2025 22:00

// Проверка на выходные
bool isWeekend = date.IsWeekend();

Полезно для тестов и быстрых прототипов,

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