MoreDateTime—.NET的ExtendedDateTime扩展库

一个扩展库,用于简化处理.NET的DateTime、DateOnly、TimeOnly和TimeSpan对象,还包括对ISO 8601的EDTF配置文件的支持

构建状态NuGet 版本

📅 MoreDateTime – Github / Docs

⭐ 新闻 v1.3 ⭐

刚刚包含:ISO 8601-2 2019 扩展日期时间格式配置文件 (EDTF) 支持。

您可以像使用 .NET 的 DateTime 类一样使用新的 ExtendedDateTime 类,它支持 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 之后

您可以看到,有很多指定日期和日期范围的可能性。

文档仍然有点不完整,但这将很快得到补充。还需要做一些较小的代码清理。

附言:我很想包含完整的 ISO 8601-2 2019 支持,但那是一个大块头,也许将来的某一天。欢迎志愿者加入。

描述

这个库从头开始构建,旨在成为一个简单、易于使用和直观的 .NET 日期和时间库,简化常见任务,并为使用日期、时间和时间范围 (Periods) 的 .NET 对象提供一致的 API。它添加了很多在日期和时间库中期望找到的操作,但在 .NET 标准库中缺失。它目前拥有300多个处理日期、时间和范围 (periods) 的方法。
然而,它不是标准 .NET 库的替代品,而是其扩展。它建立在现有的 .NET 标准库之上,不替换任何现有功能。它也不是用于取代 NodaTime 库的替代品,但可以与其同时使用。

类型之间的转换或混合类型的操作 (例如,在不手动将一个转换为另一个的情况下使用 DateTime 和 DateOnly) 是可能的。

例如: 使用 NextWeek() 将 DateTime 或 DateOnly 推进到下一周的同一工作日,使用 NextYear() 将一年加到 DateTime 或 DateOnly 对象上 (是的,当然可以使用现有的 .AddYears(1) 方法,但它看起来不够清晰),使用 NextWorkday() 将 DateTime 或 DateOnly 对象推进到给定 Calendar 上的下一个工作日。

或者像IsWeekend()这样的东西,当然你也可以用myDate.DayOfWeek == DayOfWeek.Saturday || myDate.DayOfWeek == DayOfWeek.Sunday来实现,但读起来就不那么顺畅了。此外,我们还有IsWorkday(),它是IsWeekend()的相反,还有IsHoliday(),它检查给定日期是否是给定日历上的假日

更不用说IsBetween()方法了,这是一个非常有用的方法,用于检查一个日期是否在另外两个日期之间。它还支持DateOnlyTimeOnly对象。

对于更复杂的操作,我们还有枚举,比如EnumerateDaysUntilEnumerateMonthsUntilEnumerateYearsUntilEnumerateWeeksUntilEnumerateWorkdaysUntilEnumerateWeekendsUntilEnumerateHolidaysUntil

最后,您可以给DateOnly对象添加分钟(如果超过一天)->myDate.AddMinutes(525600); // 这是一年的分钟数,如果需要的话,甚至可以添加小时或秒数。

想知道每月的第一个星期一吗?->myDate.FirstMondayOfTheMonth()或者每月的最后一个星期五吗?->myDate.LastFridayOfTheMonth()。你有多少次已经需要知道一个月的第一天或最后一天了?->myDate.FirstDayOfTheMonth()myDate.LastDayOfTheMonth()

需要知道一段时间内的工作日数吗?->myDate.NumberOfDaysUntil()或一段时间内的假日数吗?->myDate.NumberOfHolidaysUntil()

您还可以使用EnumerateInStepsUntil创建自定义枚举,它允许您从开始日期或时间到以TimeSpan指定的步骤直到结束日期或时间的枚举。就像这样

void ListAllDaysNotHolidays(DateOnly startDate)
{
	// 如果当前Culture不适用,您还可以为EnumerateInStepsUntil方法提供一个Calendar对象
	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,您可以注入自己的日期和时间并直接进行模拟。您可以使用DateTimeProvider.Current.UtcNow而不是DateTime.Utcnow,始终获得您预期的日期和时间。

如何使用它?

只需安装NuGet软件包,您就可以立即使用了!它主要基于在.NET中使用日期和时间对象的常识。

依赖关系

对于假日计算,它使用了Nager.Date库,但您需要提供自己的许可证密钥。还有一个默认的HolidayProvider(),它只知道很少的国际假日,而且是默认的。您还可以通过IHolidayProvider接口和DateTimeProvider.SetHolidayProvider()方法使用自己的提供程序。

注意

文档大部分已经完整,尽管可能还有一些缺失或错误的描述(通常是复制粘贴错误)。如果您发现有任何缺失或错误,请告诉我。

单元测试覆盖了大约98%的代码,但还有一些边缘情况尚未覆盖。因此,对代码的正确性有很高的信心。

示例

NuGet

NuGet包可以通过NuGet获取。

PM> install-package MoreDateTime

.NET示例(NuGet包)

即将推出

示例1 – tbd

--> code sample here, coming asap

Leave a Reply

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