算 10 天/周/月/年后的日期)
開發(fā)工具【免費(fèi)下載鏈接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities項(xiàng)目地址https://gitcode.com/gh_mirrors/hu/Humanizer點(diǎn)擊查看免費(fèi)下載InDate.Ten是 Humanizer FluentDate流式日期API 中專門封裝“以 10 為時(shí)間增量”的靜態(tài)嵌套類它圍繞 .NET 6 的System.DateOnly類型提供了一組零配置、強(qiáng)類型、可讀性極高的日期偏移工具既支持以當(dāng)前時(shí)刻UTC為基準(zhǔn)取“從現(xiàn)在起 10 天后”等屬性也支持基于任意基準(zhǔn)日期計(jì)算偏移的方法。讀完本文你將掌握InDate.Ten全部 4 個(gè)屬性與 8 個(gè)方法的簽名、語義與返回值理解其底層實(shí)現(xiàn)與 T4 代碼生成機(jī)制并能在真實(shí)業(yè)務(wù)代碼中把它與InDate的月份屬性、InDate.Five等其他嵌套類組合使用。一、InDate.Ten 是什么FluentDate API 中的“十”號(hào)單元Humanizer 的 FluentDate 目錄提供了兩類日期表達(dá)方式一類是“絕對(duì)日期”例如InDate.January當(dāng)年 1 月 1 日、OnDate.April.The21st4 月 21 日另一類是“相對(duì)日期偏移”即In、InDate下按 One 到 Ten 組織的嵌套靜態(tài)類。InDate.Ten屬于后者它的定位非常單一把“10 天 / 10 周 / 10 個(gè)月 / 10 年”這四種偏移量以可讀的靜態(tài)屬性和方法形式暴露出來。public static class InDate.Ten從源碼結(jié)構(gòu)看InDate.Ten是public partial class InDateInDate.cs內(nèi)部的一個(gè)public static class嵌套類型整個(gè)類只包含靜態(tài)成員無需實(shí)例化不依賴任何外部配置即可直接調(diào)用。它繼承鏈上只有System.Object即普通靜態(tài)類但它真正的價(jià)值不在于繼承體系而在于把最容易寫錯(cuò)、最需要注釋的“魔法數(shù)字日期偏移”變成了自文檔化的 API 調(diào)用。需要特別說明的適用前提InDate這一 DateOnly 版本的 FluentDate API 整體以#if NET6_0_OR_GREATER編譯指令包裹見 InDate.SomeTimeFrom.cs因?yàn)镾ystem.DateOnly是 .NET 6 才引入的類型因此只有面向 .NET 6 及以上目標(biāo)框架的項(xiàng)目才能使用InDate.Ten。如果你的項(xiàng)目運(yùn)行在 .NET 5 或更早版本上則應(yīng)改用基于DateTime的In.Ten系列。二、屬性成員基于當(dāng)前 UTC 時(shí)刻的“從現(xiàn)在起”偏移InDate.Ten提供 4 個(gè)只讀靜態(tài)屬性全部以DateTime.UtcNow為基準(zhǔn)計(jì)算返回System.DateOnly。它們的語義是“從現(xiàn)在起 10 個(gè)時(shí)間單位后是哪一天”屬性說明簽名返回值Days10 days from now從現(xiàn)在起 10 天后public static System.DateOnly Days { get; }System.DateOnlyWeeks10 weeks from now從現(xiàn)在起 10 周后public static System.DateOnly Weeks { get; }System.DateOnlyMonths10 months from now從現(xiàn)在起 10 個(gè)月后public static System.DateOnly Months { get; }System.DateOnlyYears10 years from now從現(xiàn)在起 10 年后public static System.DateOnly Years { get; }System.DateOnly底層實(shí)現(xiàn)與“UTC 基準(zhǔn)”語義這四個(gè)屬性并非黑盒其實(shí)現(xiàn)直接寫在 InDate.SomeTimeFrom.cs 的Ten類中模式高度統(tǒng)一public static DateOnly Days DateOnly.FromDateTime(DateTime.UtcNow.AddDays(10)); public static DateOnly Weeks DateOnly.FromDateTime(DateTime.UtcNow.AddDays(70)); public static DateOnly Months DateOnly.FromDateTime(DateTime.UtcNow.AddMonths(10)); public static DateOnly Years DateOnly.FromDateTime(DateTime.UtcNow.AddYears(10));值得注意的實(shí)現(xiàn)細(xì)節(jié)基準(zhǔn)統(tǒng)一為 UTC屬性基于DateTime.UtcNow而非DateTime.Now從源碼看這是有意設(shè)計(jì)——Days/Weeks/Months/Years全部以DateTime.UtcNow為起點(diǎn)避免因服務(wù)器時(shí)區(qū)不同導(dǎo)致“今天”的判定漂移。測試 GeneratedFluentDateTests.cs 也專門以DateTime.UtcNow為基準(zhǔn)做區(qū)間斷言Assert.InRange(actual, Add(before, amount, unit), Add(after, amount, unit))驗(yàn)證屬性返回值落在期望偏移區(qū)間內(nèi)。周的單位換算Weeks不是調(diào)用AddWeeksDateOnly/DateTime也沒有該方法而是直接換算成天數(shù)——10 * 7 70天。這與Days的實(shí)現(xiàn)同源。月/年的日歷語義AddMonths(10)與AddYears(10)是日歷運(yùn)算會(huì)自動(dòng)處理大小月與閏年。例如在 1 月 31 日調(diào)用MonthsFrom得到的是 11 月的月末日期由 .NET 的日歷算法決定如 1 月 31 日 10 個(gè)月 11 月 30 日。時(shí)間分量被丟棄偏移計(jì)算完成后通過DateOnly.FromDateTime(...)只保留日期部分時(shí)分秒及偏移時(shí)刻UTC均不保留所以屬性返回的是純粹“哪一天”的概念。典型用法示例using Humanizer; // 從現(xiàn)在起 10 天后的日期只含日期無時(shí)間分量 DateOnly inTenDays InDate.Ten.Days; // 從現(xiàn)在起 10 個(gè)月后的日期例如用于訂閱續(xù)期提醒 DateOnly renewalDate InDate.Ten.Months; // 直接從控制臺(tái)輸出 Console.WriteLine(InDate.Ten.Years); // 例如 2036-09-24依調(diào)用時(shí)刻而定注意屬性是“即時(shí)計(jì)算”的每次訪問都會(huì)重新讀取DateTime.UtcNow并重新計(jì)算因此同一次運(yùn)行中兩次讀取屬性若恰逢午夜切換返回值可能差一天若你需要在同一基準(zhǔn)下取多個(gè)偏移建議先固定一個(gè)基準(zhǔn)日期再使用方法成員見下一節(jié)。三、方法成員基于指定基準(zhǔn)日期的偏移計(jì)算InDate.Ten的 8 個(gè)方法分為兩組對(duì)System.DateOnly基準(zhǔn)的 4 個(gè)重載、對(duì)System.DateTime基準(zhǔn)的 4 個(gè)重載。它們的語義統(tǒng)一為“距離給定日期 10 個(gè)時(shí)間單位后的日期”且返回值一律是System.DateOnly即使入?yún)⑹荄ateTime也是如此。方法說明簽名DaysFrom(DateOnly)10 days from the provided datepublic static System.DateOnly DaysFrom(System.DateOnly date)DaysFrom(DateTime)10 days from the provided datepublic static System.DateOnly DaysFrom(System.DateTime date)WeeksFrom(DateOnly)10 weeks from the provided datepublic static System.DateOnly WeeksFrom(System.DateOnly date)WeeksFrom(DateTime)10 weeks from the provided datepublic static System.DateOnly WeeksFrom(System.DateTime date)MonthsFrom(DateOnly)10 months from the provided datepublic static System.DateOnly MonthsFrom(System.DateOnly date)MonthsFrom(DateTime)10 months from the provided datepublic static System.DateOnly MonthsFrom(System.DateTime date)YearsFrom(DateOnly)10 years from the provided datepublic static System.DateOnly YearsFrom(System.DateOnly date)YearsFrom(DateTime)10 years from the provided datepublic static System.DateOnly YearsFrom(System.DateTime date)兩種重載的源碼實(shí)現(xiàn)差異以DaysFrom為例InDate.SomeTimeFrom.cspublic static DateOnly DaysFrom(DateOnly date) date.AddDays(10); public static DateOnly DaysFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(10));DateOnly 重載直接在DateOnly上調(diào)用AddDays(10)實(shí)現(xiàn)最輕量沒有任何類型轉(zhuǎn)換。DateTime 重載先在DateTime上做AddDays(10)偏移此時(shí)保留原時(shí)間分量再經(jīng)DateOnly.FromDateTime(...)截?cái)酁榧內(nèi)掌?。也就是說當(dāng)你傳入帶時(shí)間的DateTime時(shí)返回結(jié)果不會(huì)保留傳入的時(shí)分秒只保留日期。WeeksFrom同樣換算為天數(shù)AddDays(70)MonthsFrom使用AddMonths(10)YearsFrom使用AddYears(10)規(guī)律與屬性一致。參數(shù)注意事項(xiàng)參數(shù)date接收System.DateOnly或System.DateTime兩種重載可無縫混用——例如從數(shù)據(jù)庫讀出的DateTime和業(yè)務(wù)層新建的DateOnly都能直接傳入。日歷運(yùn)算的邊界行為由 .NET 運(yùn)行時(shí)決定月末日期 10 個(gè)月時(shí)返回值會(huì)由AddMonths的鉗制規(guī)則調(diào)整到目標(biāo)月份的有效日期閏年 2 月 29 日 10 年時(shí)AddYears會(huì)按 .NET 的規(guī)則鉗制如返回 3 月 1 日或 2 月 28 日取決于具體目標(biāo)年份。測試 GeneratedFluentDateTests.cs 甚至專門用閏日2024-02-29作為基準(zhǔn)來斷言From系列方法的偏移結(jié)果說明這類邊界是 API 語義的一部分。典型用法示例using Humanizer; // 以固定基準(zhǔn)計(jì)算保證多次取值的基準(zhǔn)一致 var baseDate new DateOnly(2026, 9, 24); DateOnly d InDate.Ten.DaysFrom(baseDate); // 2026-10-04 DateOnly w InDate.Ten.WeeksFrom(baseDate); // 2026-12-03 DateOnly m InDate.Ten.MonthsFrom(baseDate); // 2027-07-24 DateOnly y InDate.Ten.YearsFrom(baseDate); // 2036-09-24 // DateTime 入?yún)⑼瑯涌捎梅祷刂等允?DateOnly var baseDateTime new DateTime(2026, 9, 24, 15, 30, 0, DateTimeKind.Utc); DateOnly result InDate.Ten.DaysFrom(baseDateTime); // 2026-10-04時(shí)間分量被丟棄四、從 T4 模板到成品代碼InDate.Ten 的生成機(jī)制InDate.Ten并不是手工逐個(gè)編寫的而是由 T4 文本模板驅(qū)動(dòng)生成。模板 InDate.SomeTimeFrom.tt 中的核心循環(huán)如下#for (var i 1; i 10; i){ var plural i 1 ? s : ; var day Day plural; var week Week plural; var month Month plural; var year Year plural; # public static class # i.ToWords().Dehumanize() # { public static DateOnly # day # DateOnly.FromDateTime(DateTime.UtcNow.AddDays(# i #)); // ……Weeks/Months/Years 與各類 From 方法同理 } #}#這段模板揭示了三個(gè)關(guān)鍵事實(shí)One 到 Ten 的十個(gè)嵌套類是同一模板的產(chǎn)物循環(huán)變量i從 1 遍歷到 10每個(gè)迭代生成一個(gè)以英文單詞命名的靜態(tài)類One、Two……Ten。InDate.Ten對(duì)應(yīng)i 10的迭代。類名來自 Humanizer 自身的能力i.ToWords().Dehumanize()把整數(shù)轉(zhuǎn)成英文單詞如10 → Ten這恰好演示了 Humanizer 的“吃自己的狗糧”——用庫內(nèi)的數(shù)字轉(zhuǎn)單詞與反人性化 API 生成自己的代碼。單復(fù)數(shù)命名規(guī)則plural i 1 ? s : 決定了成員命名——i 10時(shí)生成復(fù)數(shù)形式的Days、Weeks、Months、Years和DaysFrom、WeeksFrom、MonthsFrom、YearsFrom這與InDate.One的Day、Month等單數(shù)命名形成對(duì)照見 InDate.SomeTimeFrom.cs。因此本文檔中看到的InDate.Ten全部成員其命名、簽名和實(shí)現(xiàn)模式都嚴(yán)格受控于模板后續(xù)若要新增更大的數(shù)值如 Eleven、Twenty改模板并重新生成即可這保證了 FluentDate API 全家族的結(jié)構(gòu)一致性。五、測試佐證GeneratedFluentDateTests 如何驗(yàn)證 Ten倉庫用反射式測試對(duì)生成的 FluentDate API 做全覆蓋驗(yàn)證InDate.Ten的成員同樣被納入其中GeneratedFluentDateTests.cs屬性測試InDateRelativeDatePropertiesReturnExpectedUtcOffsetsL34-L35遍歷InDate下的所有相對(duì)日期嵌套類型對(duì)每個(gè)靜態(tài)屬性在調(diào)用前后分別取DateTime.UtcNow斷言返回值落在[Add(before), Add(after)]區(qū)間內(nèi)從而驗(yàn)證InDate.Ten.Days等屬性確實(shí)是“當(dāng)前 UTC 時(shí)刻 對(duì)應(yīng)偏移”。DateOnly/DateTime 方法測試InDateRelativeDateOnlyMethodsReturnExpectedOffsetsFromProvidedDate與InDateRelativeDateTimeMethodsReturnExpectedOffsetsFromProvidedDateTimeL38-L43以固定基準(zhǔn)含 2024-02-29 閏日調(diào)用From方法并用Assert.Equal精確斷言偏移結(jié)果覆蓋InDate.Ten.DaysFrom、WeeksFrom、MonthsFrom、YearsFrom的全部 8 個(gè)重載。數(shù)量映射L329-L341RelativeAmounts字典把Ten映射為10測試據(jù)此計(jì)算期望偏移量與模板中的i 10一致。另外手寫的 InDateTests.cs 展示了該類家族的直接使用方式如InDate.Five.DaysFrom(baseDate)InDate.Ten的調(diào)用形態(tài)與之完全相同可互為參考。六、實(shí)戰(zhàn)組合把 InDate.Ten 融入日期業(yè)務(wù)邏輯InDate.Ten單獨(dú)使用價(jià)值有限它的設(shè)計(jì)意圖是與InDate家族的其他成員組合寫出可讀性極強(qiáng)的日期邏輯using Humanizer; // 場景 1訂閱到期提醒 —— 固定基準(zhǔn) 多種偏移組合 var signupDate new DateOnly(2026, 9, 24); var trialEnd InDate.Ten.DaysFrom(signupDate); // 試用期10 天后 var planReview InDate.Ten.MonthsFrom(signupDate); // 復(fù)查節(jié)點(diǎn)10 個(gè)月后 // 場景 2與絕對(duì)日期 API 組合 —— 從“今年 1 月 1 日”起算 var yearStart InDate.January; // 當(dāng)年 1 月 1 日 var reportDue InDate.Ten.MonthsFrom(yearStart); // 當(dāng)年 11 月 1 日 // 場景 3與 OnDate 組合 —— 從“4 月 21 日”起算 10 周 var anchor OnDate.April.The21st; // 當(dāng)年 4 月 21 日 var milestone InDate.Ten.WeeksFrom(anchor); // 其后第 10 周 // 場景 4與 InDate.Five 等其他增量類對(duì)照 var fiveYearsLater InDate.Five.Years; // 從現(xiàn)在起 5 年后 var tenYearsLater InDate.Ten.Years; // 從現(xiàn)在起 10 年后使用時(shí)的幾條建議固定基準(zhǔn)優(yōu)先需要同一基準(zhǔn)下的多個(gè)偏移時(shí)先取基準(zhǔn)如var base InDate.January;再連續(xù)調(diào)用From方法避免多次訪問“now 屬性”導(dǎo)致基準(zhǔn)漂移。注意返回值類型所有屬性與方法都返回DateOnly如果你的下游 API 需要DateTime請(qǐng)自行轉(zhuǎn)換如InDate.Ten.Days.ToDateTime(TimeOnly.MinValue)。框架版本限制InDate.Ten僅在NET6_0_OR_GREATER編譯條件下可用.NET 5 及以下請(qǐng)使用基于DateTime的 In.Ten。七、快速參考InDate.Ten成員一覽public static命名空間Humanizer屬性Days、Weeks、Months、Years基于DateTime.UtcNow返回DateOnly方法DaysFrom、WeeksFrom、MonthsFrom、YearsFrom每種均有DateOnly與DateTime兩個(gè)重載統(tǒng)一返回DateOnly關(guān)聯(lián)源碼與測試實(shí)現(xiàn)src/Humanizer/FluentDate/InDate.SomeTimeFrom.cs生成模板src/Humanizer/FluentDate/InDate.SomeTimeFrom.tt容器類src/Humanizer/FluentDate/InDate.cs反射測試tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs直接使用示例tests/Humanizer.Tests/FluentDate/InDateTests.cs贊分享開發(fā)工具【免費(fèi)下載鏈接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities項(xiàng)目地址https://gitcode.com/gh_mirrors/hu/Humanizer點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Humanizer 流式日期 API 詳解InDate.Ten 的 10 天 / 周 / 月 / 年日期計(jì)算Humanizer 流式日期 API 詳解InDate.Ten 的 10 天 / 周 / 月 / 年日期計(jì)算 本篇技術(shù)指南聚焦 Humanizer 流式日期開發(fā)工具Humanizer InDate.Four 詳解用流式 API 生成4 天/周/月/年后的 DateOnly 日期Humanizer InDate.Four 詳解用流式 API 生成4 天/周/月/年后的 DateOnly 日期 Humanizer 的 FluentD開發(fā)工具Humanizer InDate.Six 詳解用 DateOnly 流暢表達(dá)「六天后 / 六周后 / 六月后 / 六年后」的日期計(jì)算Humanizer InDate.Six 詳解用 DateOnly 流暢表達(dá)「六天后 / 六周后 / 六月后 / 六年后」的日期計(jì)算 導(dǎo)讀 InDate.Si開發(fā)工具上一篇3大痛點(diǎn)突破JeecgBoot模型配置測試效率優(yōu)化指南下一篇1Panel項(xiàng)目中Nginx反向代理配置解析的優(yōu)化實(shí)踐創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考