书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。
01、获取当前日期所在月的第一个指定星期几
该方法和前面介绍的获取当前日期所在周的第一天(周一)核心思想是一样的,只是把求周一改成求周几而已,当然其中有些小细节需要注意,比如求所在周的第一天则两天都在同一周,而求所在月第一个指定周则可能两天在不同周,具体代码如下:
下面我们还需要做详细的单元测试,我们分别测试指定周一和周日两个特殊日期,然后再分别测试三种特殊情况:
指定周一测试:
(1) 验证当前日期是周五,而周一在下一周的情况;
(2) 验证当前日期是本月第一个周一的情况;
(3) 验证当前日期是周日,并且在本月第一个周一之后的情况;
指定周日测试:
(1) 验证当前日期是周五,并且在本月第一个周日之前的情况;
(2) 验证当前日期是本月第一个周日的情况;
(3) 验证当前日期是周一,并且在本月第一个周日之后的情况;
具体代码如下:
02、获取当前日期所在月的最后一个指定星期几
该方法和上一个求第一个指定星期几核心思想是一样的,具体代码如下:
单元测试可以参考求第一个指定星期几,这里就不赘述了。
03、获取当前日期上一个指定星期几
求上一个指定周几,其实也不复杂,首先计算出当前日期与目标星期几相差的天数,其中有个小细节需要注意,就是如果两个日期相同,则需要把相差天数改为7,具体代码如下:
我们分别对以下四种情况做单元测试:
(1) 验证当前日期是周一,而上一个周一在上一月的情况;
(2) 验证当前日期是周一,而上一个周一在当月的情况;
(3) 验证当前日期是周日,而上一个周一在当月的情况;
(4) 验证当前日期是周六,并且是当月最后一天的情况;
具体代码如下:
04、获取当前日期下一个指定星期几
该方法和上面获取上一个指定星期几核心思想相同,具体代码如下:
单元测试也可以参考求上一个指定星期几,这里就不再赘述了。
05、获取当前日期是其所在月的第几周
该方法的核心思想是,获取当前日期和当月第一天相差多少天,然后用相差的天数除以7即可获得当前是第几周。
但是这里有个比较麻烦的事情是如果第一周不满一周呢,比如当月的第一周第一天是2024-11-01周五,而今天是2024-11-07周四,应该是当月的第二周,但是如果直接计算两天的差再除以7结果显然是不对的。
因此我们首先需要把第一周不满一周的天数补上,即前面还有4天。
如此就是(7+4)/7=1…4,即所在第二周,其中商表示完整的周,余数则表示不完整的周。如果转为公式则为:days/7 + (days%7 > 0 ? 1 : 0),我们对这个公式简化后得到:(days + 6)/7,具体实现代码如下:
下面我们对其进行以下几种情况详细的单元测试:
(1) 验证当前日期是周五,且是当月第一天的情况;
(2) 验证当前日期是周日,且在当月第一周的情况;
(3) 验证当前日期是周一,且在当月第三周的情况;
(4) 验证当前日期是周日,且在当月第三周的情况;
(5) 验证当前日期是周六,且是当月最后一天的情况;
具体代码如下:
06、获取当前日期是其所在年的第几周(ISO 8601 标准)
在ISO 8601 标准规定中,每周从星期一开始,且每年最少有 52 周,每年的第一周是包含该年第一天的那一周,且该周必须至少有四天。
获取当然日期所在年的第几周可以通过调用C#中文化信息中日历组件中GetWeekOfYear方法,具体代码如下:
07、获取当前日期所在月份的周数
该方法实现的核心思想是首先获取当前日期所在月份的第一天和最后一天,然后分别计算其所在当年第几周,最后相减即可得到,具体代码如下:
08、判断当前日期是否是周末
该方法比较简单,只是判断当前是否是否为周六或周日,具体代码如下:
09、判断当前日期所在年是否是闰年
该方法调用了C#内置方法IsLeapYear,具体代码如下:
10、获取当前日期所在季度
该方法也比较简单,只需要应用一个小公式即可求的,具体代码如下:
稍晚些时候我会把库上传至Nuget,大家可以直接使用Ideal.Core.Common。
注:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Ideal
领取专属 10元无门槛券
私享最新 技术干货