开源 - 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基础数学类库使用总目录 前言 ...
随机推荐
- 使用python-slim镜像遇到无法使用PostgreSQL的问题
前言 之前不是把 DjangoStarter 的 docker 方案重新搞好了吗 一开始demo部署是使用 SQLite 数据库的,用着没问题,但很快切换到 PostgreSQL 的时候就遇到问题了- ...
- 一键k8s企业级集群部署(以k8s的1.18.0版本为例)
一.下载安装sealos wget https://github.com/fanux/sealos/releases/download/v3.2.0-beta.2/sealos && ...
- AI时代的信仰是什么
信仰是人们内心深处的信念,是推动人类前进的驱动力.AI从几十年前的缓慢探索,到如今的飞速发展,是什么信仰在驱动这一切呢? 摩尔定律 聊起信仰,我就会想起信息时代的摩尔定律.摩尔定律是由英特尔联合创始人 ...
- 使用 `Roslyn` 分析器和修复器 对异步方法规范化返回Async结尾
之前写过一篇使用修复器帮助添加头部注释文本的功能,今天使用Roslyn的代码修复器对异步返回方法规范化的功能 实现分析器 首先需要实现分析器,使用RegisterSyntaxNodeAction,分析 ...
- SQL Server – 基本操作 Table 和 Column
前言 日常都是用 EF Core 来管理 Database, 偶尔也用 Management Studio, 就是很少手写 Command. 虽然网上一拉就有很多, 但是每次写单侧都要到处找还是挺烦的 ...
- c# 常用反射和表达式树整理
更新: 2021-06-19 反射 local function https://stackoverflow.com/questions/43348128/reflection-how-do-i-fi ...
- java_day2_常量,变量,数据类型,运算符
一.常量 常量:在Java程序运行过程中其值不能发生改变的量 分类: 1.字面值常量: 整数常量 表示所有的整数,包括负数 10 -8 小数常量 表示所有的小数 1.23 -3.14 布尔常量 tru ...
- Element——前端样式美化
Element 简介 Element 快速入门 https://element.eleme.cn/#/zh-CN/component/button Element 布局 ht ...
- QT框架中的缓存:为什么有QHash和QMap,还设计了QCache和QContiguousCache?
简介 本文介绍了QT框架中可用于缓存的几个数据类型各自的特点:通过本文读者可以了解到为什么有QHash和QMap,还设计了QCache和QContiguousCache? 目录 QHash和QMap有 ...
- 适用于 VitePress 的公告插件开发实记
前言 笔者维护的 VitePress 博客主题在近1年多的时间里集成了非常多功能,不少用户希望将里面的部分功能分离出来,方便在其它 VitePress 站点也可以独立使用. 其中分离的第一个组件类型的 ...