开源 - Ideal库 - 特殊时间扩展方法(三)

news/2024/11/13 5:52:42/文章来源:https://www.cnblogs.com/hugogoos/p/18538819

书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。

01、获取当天的开始时间

当天的开始时间指00:00:00时刻,因此只需要获取DateTime的Date属性只获取时间即可,具体代码如下:

//获取当天的开始时间
public static DateTime GetStartDateTimeOfDay(this DateTime dateTime)
{return dateTime.Date;
}

我们进行一个简单的单元测试,具体代码如下:

[Fact]
public void GetStartDateTimeOfDay()
{var datetime = new DateTime(2024, 11, 7, 14, 10, 10);var start = datetime.GetStartDateTimeOfDay();Assert.Equal(new DateTime(2024, 11, 7), start);
}

02、获取当天的结束时间

该方法时候获取一天中最后一刻,也就是第二天的前一刻,我们可以用第二天的开始时间减去最小时间单位得到当天的结束时间,具体代码如下:

//获取当天的结束时间
public static DateTime GetEndDateTimeOfDay(this DateTime dateTime)
{return dateTime.Date.AddDays(1).AddTicks(-1);
}

下面我们通过单元测试验证,时间部分是否为“23:59:59 9999999”,具体代码如下:

[Fact]
public void GetEndDateTimeOfDay()
{var date4 = new DateTime(2024, 11, 7, 14, 10, 10);var end = date4.GetEndDateTimeOfDay();Assert.Equal("2024-11-07 23:59:59 9999999", end.ToString("yyyy-MM-dd HH:mm:ss fffffff"));
}

03、获取当前日期所在周的第一天(周一)

要想获得当前日期所在周的周一,只需要知道当前是周几,然后计算出和周一相差几天,最后使用AddDays方法即可。

首先我们可以通过DayOfWeek获取到日期是周几枚举值,但是这个枚举值对应的int值是

0 = Sunday 周日, 1 = Monday 周一, ..., 6 = Saturday 周六。其中周日的0就显得很异类,处理起来也就比较麻烦。

因此如果当前日期是周日那么就会出现周日减周一等于0减1等于-1的情况,所有我们需要加7来保证结果为正数。

同样如果当前日期是周六那么就会出现周六减周一等于6减1加7等于12的情况,所以我们需要同取余%7,来保证两者相差在一周天数之内。

具体代码如下:

//获取当前日期所在周的第一天(周一)
public static DateTime GetFirstDayDateTimeOfWeek(this DateTime dateTime)
{//0 = Sunday 周日, 1 = Monday 周一, ..., 6 = Saturday 周六//首先获取当前日期星期枚举值,然后计算其和周一枚举值差值//结果+7,保证结果为正数//结果%7,保证结果在0-6之间,对于一周七天,从而表示要回退多少天到周一//+7 %7 巧妙的把周日当7处理,最后再转为0var diff = ((int)dateTime.DayOfWeek - (int)DayOfWeek.Monday + 7) % 7;return dateTime.AddDays(-diff).Date;
}

下面我们需要进行详细的单元测试,我们进行了四种情况的测试分别是:

(1) 验证当前日期是周五,而周一在上一个月的情况;

(2) 验证当前日期就是周一的情况;

(3) 验证当前日期是周四,而周一在当月的情况

(4) 验证当前日期是周日,而周一在当月的情况

具体代码如下:

[Fact]
public void GetFirstDayDateTimeOfWeek()
{//验证当前日期是周五,而周一在上一个月的情况var friday = new DateTime(2024, 11, 1, 14, 10, 10);var day_friday = friday.GetFirstDayDateTimeOfWeek();Assert.Equal(new DateTime(2024, 10, 28), day_friday);//验证当前日期就是周一的情况var monday = new DateTime(2024, 11, 4, 4, 10, 10);var day_monday = monday.GetFirstDayDateTimeOfWeek();Assert.Equal(new DateTime(2024, 11, 4), day_monday);//验证当前日期是周四的情况var thursday = new DateTime(2024, 11, 7, 4, 10, 10);var day_thursday = thursday.GetFirstDayDateTimeOfWeek();Assert.Equal(new DateTime(2024, 11, 4), day_thursday);//验证当前日期是周日的情况var sunday = new DateTime(2024, 11, 10, 4, 10, 10);var day_sunday = sunday.GetFirstDayDateTimeOfWeek();Assert.Equal(new DateTime(2024, 11, 4), day_sunday);
}

04、获取当前日期所在周的最后一天(周日)

该方法和上面获取周一的思想一样,我们可以把周日枚举值就当作7来处理,具体代码如下:

//获取当前日期所在周的最后一天(周日)
public static DateTime GetLastDayDateTimeOfWeek(this DateTime dateTime)
{//0 = Sunday 周日, 1 = Monday 周一, ..., 6 = Saturday 周六//首先计算还差几天到周日//结果%7,保证结果在0-6之间//当周日时dateTime.DayOfWeek为0,(7-0)% 7 = 0//巧妙的把周日当7处理,最后再转为0var diff = (7 - (int)dateTime.DayOfWeek) % 7;return dateTime.AddDays(diff).Date;
}

同样的我们做类似获取周一的四种情况单元测试,具体代码如下:

[Fact]
public void GetLastDayDateTimeOfWeek()
{//验证当前日期是周六,而周日在下一个月的情况var sunday = new DateTime(2024, 11, 30, 14, 10, 10);var day_sunday = sunday.GetLastDayDateTimeOfWeek();Assert.Equal(new DateTime(2024, 12, 1), day_sunday);//验证当前日期就是周一的情况var monday = new DateTime(2024, 11, 4, 4, 10, 10);var day_monday = monday.GetLastDayDateTimeOfWeek();Assert.Equal(new DateTime(2024, 11, 10), day_monday);//验证当前日期是周四的情况var thursday = new DateTime(2024, 11, 7, 4, 10, 10);var day_thursday = thursday.GetLastDayDateTimeOfWeek();Assert.Equal(new DateTime(2024, 11, 10), day_thursday);//验证当前日期是周日的情况var sunday1 = new DateTime(2024, 11, 10, 4, 10, 10);var day_thursday1 = sunday1.GetLastDayDateTimeOfWeek();Assert.Equal(new DateTime(2024, 11, 10), day_thursday1);
}

05、获取当前日期所在月的第一天

这个方法比较简单,只需要使用当前日期的年份和月份,然后直接构建当月第一天,具体代码如下:

//获取当前日期所在月的第一天
public static DateTime GetFirstDayDateTimeOfMonth(this DateTime dateTime)
{return new DateTime(dateTime.Year, dateTime.Month, 1, 0, 0, 0, 0, DateTimeKind.Local);
}

这个方法太简单了,我们就不列出单元测试代码了。

06、获取当前日期所在月的最后一天

该方便也不复杂,可以先通过DaysInMonth获取当前月的总天数,然后再构建当月最后一天,具体代码如下:

//获取当前日期所在月的最后一天
public static DateTime GetLastDayDateTimeOfMonth(this DateTime dateTime)
{//获取当前月的总天数var days = DateTime.DaysInMonth(dateTime.Year, dateTime.Month);return new DateTime(dateTime.Year, dateTime.Month, days, 0, 0, 0, 0, DateTimeKind.Local);
}

同样的我们这个方法也不复杂,我们就不列举单元测试了。

07、获取当前日期所在季度的第一天

如果想要获取当前日期所在季度的第一天那么首先需要获取当前日期所在季度的第一个月是多少。

我们知道三个月为一季度,因此我们可以使用当前月份除以3,如果这样直接除就会得到:1/3=0,2/3=0,3/3=1,这样1月到3月就不在同一个季度里,所以我们使用(moth - 1)/ 3,计算出0、1、2、3表示4个季度,这样就可以计算出当前日期所在第几个季度。

计算出所在季度后我们还需要计算出当前季度的第一个月即1月、4月、7月、10月,然后找出这4个月份与上面表示4个季度值的关系即可,最终得到如下公式:(moth - 1)/ 3 * 3 +1,即为当前日期所在季度的第一个月。

最后就是直接构建日期,具体代码如下:

//获取当前日期所在季度的第一天
public static DateTime GetFirstDayDateTimeOfQuarter(this DateTime dateTime)
{//计算当前日期所在季度的起始月var firstMonth = (dateTime.Month - 1) / 3 * 3 + 1;return new DateTime(dateTime.Year, firstMonth, 1, 0, 0, 0, 0, DateTimeKind.Local);
}

然后我们分别对这个方法做以下三种情况的单元测试:

(1) 一个季度第一个月取第一天的情况;

(2) 一个季度第二个月取中间的一天的情况;

(3) 一个季度第三个月取最后一天的情况;

[Fact]
public void GetFirstDayDateTimeOfQuarter()
{//一个季度第一个月取第一天的情况var month1 = new DateTime(2024, 10, 1, 14, 10, 10);var day_month1 = month1.GetFirstDayDateTimeOfQuarter();Assert.Equal(new DateTime(2024, 10, 1), day_month1);//一个季度第二个月取中间的一天的情况var month2 = new DateTime(2024, 11, 17, 4, 10, 10);var day_month2 = month2.GetFirstDayDateTimeOfQuarter();Assert.Equal(new DateTime(2024, 10, 1), day_month2);//一个季度第三个月取最后一天的情况var month3 = new DateTime(2024, 12, 31, 4, 10, 10);var day_month3 = month3.GetFirstDayDateTimeOfQuarter();Assert.Equal(new DateTime(2024, 10, 1), day_month3);
}

08、获取当前日期所在季度的最后一天

该方法和上面获取季度的第一天思想一样,只是此方法获取当前日期所在季度的最后月份的计算公式有所差异,公式为:(moth + 2)/ 3 * 3,具体代码如下:

//获取当前日期所在季度的最后一天
public static DateTime GetLastDayDateTimeOfQuarter(this DateTime dateTime)
{//计算当前日期所在季度的最后月var lastMonth = (dateTime.Month + 2) / 3 * 3;//获取当前月的总天数var days = DateTime.DaysInMonth(dateTime.Year, lastMonth);return new DateTime(dateTime.Year, lastMonth, days, 0, 0, 0, 0, DateTimeKind.Local);
}

同样的我们对其进行三种情况单元测试,具体代码如下:

[Fact]
public void GetLastDayDateTimeOfQuarter()
{//一个季度第一个月取第一天的情况var month1 = new DateTime(2024, 10, 1, 14, 10, 10);var day_month1 = month1.GetLastDayDateTimeOfQuarter();Assert.Equal(new DateTime(2024, 12, 31), day_month1);//一个季度第二个月取中间的一天的情况var month2 = new DateTime(2024, 11, 17, 4, 10, 10);var day_month2 = month2.GetLastDayDateTimeOfQuarter();Assert.Equal(new DateTime(2024, 12, 31), day_month2);//一个季度第三个月取最后一天的情况var month3 = new DateTime(2024, 12, 31, 4, 10, 10);var day_month3 = month3.GetLastDayDateTimeOfQuarter();Assert.Equal(new DateTime(2024, 12, 31), day_month3);
}

09、获取当前日期所在年的第一天

该方法比较简单,直接用当前日期所在年份和1月1号直接构建即可,代码如下:

//获取当前日期所在年的第一天
public static DateTime GetFirstDayDateTimeOfYear(this DateTime dateTime)
{return new DateTime(dateTime.Year, 1, 1, 0, 0, 0, 0, DateTimeKind.Local);
}

10、获取当前日期所在年的最后一天

该方法也比较简单,直接用当前日期所在年份和12月31号直接构建即可,代码如下:

//获取当前日期所在年的最后一天
public static DateTime GetLastDayDateTimeOfYear(this DateTime dateTime)
{return new DateTime(dateTime.Year, 12, 31, 0, 0, 0, 0, DateTimeKind.Local);
}

稍晚些时候我会把库上传至Nuget,大家可以直接使用Ideal.Core.Common。

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Ideal

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830920.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2: v-for 联合 ref 使用, 对应引用信息为数组

MarkTime: 2024-06-03 00:21:47 LogTime: 2024-11-10 23:25:35说明问题:调用ref引用的时候, 好奇获取的时候为什么 有的返回的是对象, 有的返回的是数组 (如下图)版本:vue: 2.6.14源码 <!--已经省略掉大部分代码 只保留结构为说明 --> <template><div class=&qu…

Debug: setTimeout 使用做定时器时的错误函数传递方式

MarkTime: 2024-05-24 10:41:26 LogTime: 2024-11-10 14:55:53首先复习 setTimeout(): 语法: let timeId = setTimeout(func|code, [delay_millisecond]) 说明: 延时器. 延迟delay_millisecond后, 执行参数1setInterval(): 语法: let timeId = setInterval(func|code, [delay_…

Debug: calc() 未生效 = 内嵌样式表达式需使用空格分隔

MarkTime: 2024-06-25 17:10 LogTime: 2024-11-09 13:58:02结论calc()内的表达式 需要使用 空格分隔符, 即 更正 calc(100%-100px-10px); => calc(100% - 100px - 10px); 即可源<!-- 原错误代码 --> <div class="layout-search" style="width: 100%…

[云研发]腾讯云cloudstudio使用教程-记录1

cloudstudio在vscode中新建终端,使用nvidia-smi查看显卡与gpu情况,可知当前使用的显卡是T4的,显存有15GTalk is cheap. Show me the code

rip

题目链接:rip。 IDA 打开附件,进入到 main 函数,反编译后如下。留意到存在 gets 函数,因此存在栈溢出漏洞,经过动态调试,确定在输入 0x17 个字符后,即可覆盖到返回地址。同时,留意到存在 fun 函数,如下。因此,直接将程序执行流劫持到 fun 函数,即可 GetShell(此处需…

test_your_nc

题目链接:test_your_nc。 打开附件,进入 main 函数,IDA 反编译如下。因此直接连接即可 GetShell。

【docker应用】从Docker(k8s)镜像或者容器里提取jar包

引言 在docker或者k8s上运行了第三方的应用,很多时候我们都想知道运行流程,一般都会docker或者k8s容器中获取jar包。 那么该如何把里面的jar包提取出来呢? 其实有两种方式,分别为: 从镜像信息获取 进入容器获取从镜像信息获取 首先,查看镜像: docker image ls |grep <…

充电桩普遍选用芯海CSE7761集成3路ADC的免校准单相计量芯片

CSE7761是一款单相多功能电能计量芯片,工作于 3.579MHz 时钟频率,其内部集成了 3 路 sigmadelta ADC、功率计算器、能量-频率转换器、一路 SPI 接口、一路 UART 接口。适用于充电桩、单相多功能电能表、智能插座、智能家电等应用.CSE7761 设计用于精确计算电压有效值、电流有…

喝个水也要整智能家居?

ChatGPT对文章的摘要 这篇博客讲述了作者在家庭日常用水管理方面的改进经历。由于家里用水量增多,作者不断优化解决方案,从最初用农夫山泉桶装水,到购买反渗透净水机,再到通过智能化手段 简化补水流程。过程中,作者不断提高设备自动化程度,最终实现了全自动化补水,并且详…

基于FPGA的256QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR

1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印):设置SNR=40db:将数据导入matlab,显示其星座图:设置SNR=32db:将数据导入matlab,显示其星座图:设置SNR=24db:将数据导入matlab,显示其星座图:系统RTL结构如下:仿真操作步骤可参考程序配套的操作视频…

产业园区,被逼急了

这几年传统的地产开发业务遇到了各种各样的困境,许多房企转而开始积极布局多元化业务,业内的“去地产化”运动也愈演愈烈。 在这个时代背景下,产业园开发运营赛道迎来了一波热度爆发,吸引着众多房企和其他多元化主体的参与。那么,在日益升高的关注度与参与度之下,产业地产…

寂寂冬夜

引言 没错,本文的标题是嘉然学姐最喜欢的动漫《白色相簿2》中的插曲。 今天,chino 的 XCPC 最后一站——杭州站也结束了。(又浪费一年) 于是姑且乱写一番,也算是留下自己虚度光阴的罪证。 第一站 CCPC 哈尔滨 第一站是 CCPC 哈尔滨站,周六中午和 CD, BE, Sakura, Chen_jr 吃…