MoreDateTime—.NET的ExtendedDateTime扩展库
一个扩展库,用于简化处理.NET的DateTime、DateOnly、TimeOnly和TimeSpan对象,还包括对ISO 8601的EDTF配置文件的支持
📅 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()
方法了,这是一个非常有用的方法,用于检查一个日期是否在另外两个日期之间。它还支持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) { // 如果当前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