Работа с датами в 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" Также в библиотеке
Обработка изображений на Java: изменение размера и обрезка (resize, crop)
Elasticsearch REST клиент для Kotlin: руководство по использованию
Отправка email на Go (Golang): библиотеки и примеры кода
Реактивное программирование в Go (Golang): библиотеки, паттерны и примеры
MPAndroidChart для Kotlin: полное руководство с примерами