Работа с датами в 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();
Полезно для тестов и быстрых прототипов,
Также в библиотеке
Redis клиент для C++: подключение, установка и примеры использования
GraphQL для C# (.NET): Полное руководство по библиотеке GraphQL.NET
Sinon для JavaScript (Node.js): полное руководство с примерами
JSON обработка в C++: библиотеки, парсинг и сериализация данных