开源 - Ideal库 - 特殊时间扩展方法(三)
书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。

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处理,最后再转为0
var 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处理,最后再转为0
var 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
开源 - Ideal库 - 特殊时间扩展方法(三)的更多相关文章
- Rails时间扩展方法
1.时间扩展方法: beginning_of_day,end_of_day等等 Time.now.end_of_day 2.ruby类型判断 is_a?(类型) 如:b.is_a?(Array)
- [C#技术] .NET平台开源JSON库LitJSON的使用方法
一个简单示例: String str = "{’name’:’cyf’,’id’:10,’items’:[{’itemid’:1001,’itemname’:’hello’},{’itemi ...
- .NET平台开源JSON库LitJSON的使用方法
下载地址:LitJson.dll下载 一个简单示例: String str = "{'name':'cyf','id':10,'items':[{'itemid':1001,'itemnam ...
- (转).NET平台开源JSON库LitJSON的使用方法
一个简单示例: String str = "{’name’:’cyf’,’id’:10,’items’:[{’itemid’:1001,’itemname’:’hello’},{’itemi ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
- 扩展方法(深入理解c#)
1. 静态类到扩展方法: 许多方法可能都适合转为扩展方法,只要具有以下特征: 1)你想为一个类型添加一些成员: 2)你不需要为类型的实例添加更多的数据: 3)你不能改变类型本身,因为是别人的代码 2. ...
- 【开源】OSharp框架解说系列(3):扩展方法
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- Farseer.net轻量级开源框架 中级篇:常用的扩展方法
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: BasePage.BaseController.BaseHandler.BaseM ...
- [Swift通天遁地]五、高级扩展-(3)日期和时间类型的扩展方法
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
随机推荐
- Win32封装对话框类
[主程序入口.cpp] #include <windows.h> #include <tchar.h> #include "resource.h" #inc ...
- Linux 内核相关命令
Shell 命令: ipcs # 查看共享内存 dmesg # 显示内核消息 sudo dmesg -c # 清空内核消息 sudo mknod /dev/rwbuf c 60 0 sudo insm ...
- 【前端js】之小数点保留时的四舍五入问题
项目遇到金额小数点保留位数,极个别的数会差一分,经调查是因为js的问题. 解决办法: # 方法一:保留两位小数 function keepTwoDecimal(num) { var result = ...
- SQL Server使用脚本实现自动备份
因服务器安装的SQL Server版本不支持自动定时备份,需自行实现,大概思路为: 创建备份数据库的脚本 创建批处理脚本执行步骤一中的脚本 创建Windows定时任务执行步骤二中的脚本 1. 创建SQ ...
- DB\redis\zookeeper分布式锁设计
redis 参考目录: 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现 https://www.cnblogs.com/yizhiamumu/p/16556153.html 生产级Re ...
- 深入理解Argo CD工作原理
1. ArgoCD 的架构 ArgoCD 是一个 Kubernetes 原生的持续交付工具,它通过监控 Git 仓库中的应用定义来自动部署应用到 Kubernetes 集群.其核心架构由以下几个关键组 ...
- HTML & CSS – Practice Projects
前言 学完了 w3school 就要练练手了. 这篇是记入我学习的过程, 和知识点. update: 2022-02-27 用文章来表达太难了, 用视频比较合理. 所以我就没有继续写了. 这里记入几篇 ...
- RabbitMQ——死信队列介绍和应用
死信和死信队列的概念 什么是死信?简单来说就是无法被消费和处理的消息.一般生产者将消息投递到broker或者queue,消费者直接从中取出消息进行消费.但有时因为某些原因导致消息不能被消费,导致消息积 ...
- SpringMVC——SSM整合-异常处理器
异常处理器 出现异常的常见位置与常见诱因: 框架内部抛出的异常:因使用不合规导致 数据层抛出异常:因外部服务器故障导致(例如:服务器访问超时) 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务 ...
- SpringMVC —— SpringMVC简介
SpringMVC SpringMVC技术 与 Servlet技术功能等同,均属于web层开发技术 是一种基于java实现MVC模型的轻量级Web框架 SpringMVC 入门案例 ...