MoreDateTime – Расширенная библиотека расширения для .NET
Библиотека расширения для упрощения работы с объектами .NET DateTime, DateOnly, TimeOnly и TimeSpan, также включает поддержку профиля ISO 8601 EDTF.
📅 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