MoreDateTime – Расширенная библиотека расширения для .NET

Библиотека расширения для упрощения работы с объектами .NET DateTime, DateOnly, TimeOnly и TimeSpan, также включает поддержку профиля ISO 8601 EDTF.

Статус сборкиВерсия NuGet

📅 MoreDateTime – Github / Документация

⭐ Новости v1.3 ⭐

Только что добавлено: поддержка профиля расширенного формата даты и времени ISO 8601-2 2019 (EDTF).

Вы можете использовать новый класс ExtendedDateTime так же, как вы бы использовали класс .NET DateTime, с поддержкой большинства преобразований между ExtendedDateTime, DateTime и DateOnly. Поддерживаются все форматы, указанные в стандарте. Реализация основана на реализации EDTF.NET, которая базируется на проекте черновика стандарта ISO.

Пример:

var someWhenInThe60s = new ExtendedDateTime("1960S2");
var longAgo = new ExtendedDateTime("Y-3388E2S3"); // да, это какой-то год между 338000 и 338999, предположительно 338800
var fourYearsIn1670 = new ExtendedDateTime("1670..1673");
var someDayInSpring = new ExtendedDateTime("2021-21");
var aRange = new ExtendedDateTime("..1983-12-31,1984-10-10..1984-11-01,1984-11-05.."); // где-то до 1983 и между 1984-10-10 и 1984-11-01 и после 1984-11-05

Как видите, есть много возможностей для указания дат и диапазонов дат.

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

PS: Я бы хотел включить полную поддержку ISO 8601-2 2019, но это большой объем работы, может быть, когда-нибудь. Добровольцы приветствуются.

Описание

Эта библиотека создана с нуля для создания простой, легкой в использовании и интуитивно понятной библиотеки для работы с датами и временем в .NET, которая упрощает общие задачи и предоставляет последовательный API для работы с датами и временем, с помощью объектов DateTime, DateOnly, TimeOnly и TimeSpan .NET. Она добавляет множество операций, которые ожидаются в библиотеке для работы с датой и временем, но отсутствуют в стандартной библиотеке .NET. В настоящее время она содержит более 300 методов для работы с датами и временем и их диапазонами (периодами).

Однако она не предназначена для замены какой-либо части стандартной библиотеки .NET, а скорее является ее расширением. Она основана на существующей стандартной библиотеке .NET и не заменяет никакую существующую функциональность. Она также не предназначена для замены библиотеки NodaTime, но может использоваться вместе с ней.

Преобразования между типами или операции смешанных типов (например, использование DateTime и DateOnly без ручного преобразования из одного в другой) возможны.

Например: NextWeek() для продвижения DateTime или DateOnly на следующую неделю в тот же день недели, NextYear() для добавления года к объекту DateTime или DateOlnly (да, конечно, вы можете использовать существующий метод .AddYears(1), но это не так наглядно), NextWorkday() для продвижения объекта DateTime или DateOnly на следующий рабочий день в указанном календаре.

Или вещи типа IsWeekend(), которые конечно же можно сделать с помощью myDate.DayOfWeek == DayOfWeek.Saturday || myDate.DayOfWeek == DayOfWeek.Sunday, но это не так приятно читать. И у нас также есть IsWorkday(), который является противоположностью IsWeekend(), а также IsHoliday(), который проверяет, является ли данная дата праздником в данном календаре.

Не говоря уже о методе IsBetween(), который очень полезен для проверки, находится ли дата между двумя другими датами. Он также поддерживает объекты DateOnly и TimeOnly.

Для более сложных операций у нас есть Перечисления, такие как EnumerateDaysUntil, EnumerateMonthsUntil, EnumerateYearsUntil, EnumerateWeeksUntil, EnumerateWorkdaysUntil, EnumerateWeekendsUntil, EnumerateHolidaysUntil.

Наконец, вы можете добавить минуты к объекту DateOnly (если это больше, чем один день) -> myDate.AddMinutes(525600); // это год в минутах или даже часы или секунды, если вы хотите.

Хотите знать Первый понедельник месяца? -> myDate.FirstMondayOfTheMonth() или Последний пятница месяца? -> myDate.LastFridayOfTheMonth(). Как часто вам уже приходилось знать первый или последний день месяца? -> myDate.FirstDayOfTheMonth() или myDate.LastDayOfTheMonth().

Нужно знать количество рабочих дней за период? -> myDate.NumberOfDaysUntil() или количество праздников за период? -> myDate.NumberOfHolidaysUntil().

Вы также можете создавать пользовательские перечисления с помощью EnumerateInStepsUntil, позволяющего создавать перечисления от начальной даты или времени до конечной даты или времени с шагами, указанными в TimeSpan. Например,

void ListAllDaysNotHolidays(DateOnly startDate)
{
	// можно также предоставить объект календаря методу EnumerateInStepsUntil, если текущая культура не подходит
	var myEnum = startDate.EnumerateInStepsUntil(startDate.AddMonths(6), TimeSpan.FromDays(1), SkipHolidays);

	foreach (var item in myEnum)
	{
		Console.WriteLine(item);
	}

	bool SkipHolidays(DateOnly date) => return !date.IsHoliday();
}

Еще пример, создание интервалов по 10 минут в течение недели, но пропуск полуночи

void Get10MinuteSpans(DateTime startDate)
{
	var myEnum = startDate.EnumerateInStepsUntil(startDate.NextWeek(), TimeSpan.FromMinutes(10), SkipMidnight);

	foreach (var item in myEnum)
	{
		Console.WriteLine(item);
	}

	bool SkipMidnight(DateTime date)
	{
		return !date.IsMidnight();
	}
}

Вам доступен ваш собственный IDateTimeProvider, через который вы можете внедрить свою собственную дату и время и поддержку прямого мокирования. Вместо DateTime.UtcNow вы можете использовать DateTimeProvider.Current.UtcNow и всегда получать ожидаемую дату и время.

Как это использовать?

Просто установите пакет NuGet и вы готовы к работе! Он в основном строится на здравом смысле при использовании объектов Date и Time в .NET.

Зависимости

Для расчета праздников используется библиотека Nager.Date, но вам нужно предоставить свой собственный лицензионный ключ. Также есть DefaultHolidayProvider(), который знает только очень немногие международные праздники и является по умолчанию. По желанию вы можете использовать свой собственный провайдер через интерфейс IHolidayProvider и метод DateTimeProvider.SetHolidayProvider().

Примечание

Документация в основном является полной, хотя могут быть отсутствующие или даже неправильные описания (обычно это ошибки при копировании и вставке). Если вы обнаружите, что что-то отсутствует или неверно, пожалуйста, дайте мне знать.

Модульные тесты покрывают ~98% кода, пока еще не покрыты несколько крайних случаев. Поэтому существует высокая уверенность в правильности работы кода.

Примеры

NuGet

Пакет NuGet доступен по ссылке NuGet

PM> install-package MoreDateTime

Примеры для .NET (пакет NuGet)

скоро появятся

Пример 1 – пока что не указан

--> здесь будет пример кода, скоро

Leave a Reply

Your email address will not be published. Required fields are marked *