开源 - Ideal库 -获取特殊时间扩展方法(四)

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

在这里插入图片描述

01、获取当前日期所在月的第一个指定星期几

该方法和前面介绍的获取当前日期所在周的第一天(周一)核心思想是一样的,只是把求周一改成求周几而已,当然其中有些小细节需要注意,比如求所在周的第一天则两天都在同一周,而求所在月第一个指定周则可能两天在不同周,具体代码如下:

//获取当前日期所在月的第一个指定星期几
public static DateTime GetFirstDayOfWeekDateTimeInMonth(this DateTime dateTime, DayOfWeek dayOfWeek)
{//获取当前日期所在月的第一天var firstDayOfMonth = dateTime.GetFirstDayDateTimeOfMonth();//计算目标日期与当月第一天相差天数var diff = ((int)dayOfWeek - (int)firstDayOfMonth.DayOfWeek + 7) % 7;return firstDayOfMonth.AddDays(diff);
}

下面我们还需要做详细的单元测试,我们分别测试指定周一和周日两个特殊日期,然后再分别测试三种特殊情况:

指定周一测试:

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

(2) 验证当前日期是本月第一个周一的情况;

(3) 验证当前日期是周日,并且在本月第一个周一之后的情况;

指定周日测试:

(1) 验证当前日期是周五,并且在本月第一个周日之前的情况;

(2) 验证当前日期是本月第一个周日的情况;

(3) 验证当前日期是周一,并且在本月第一个周日之后的情况;

具体代码如下:

[Fact]
public void GetFirstDayOfWeekDateTimeInMonth()
{//验证当前日期是周五,而周一在下一周的情况var friday_monday = new DateTime(2024, 11, 1, 14, 10, 10);var day_friday_monday = friday_monday.GetFirstDayOfWeekDateTimeInMonth(DayOfWeek.Monday);Assert.Equal(new DateTime(2024, 11, 4), day_friday_monday);//验证当前日期是本月第一个周一的情况var monday_monday = new DateTime(2024, 11, 4, 4, 10, 10);var day_monday_monday = monday_monday.GetFirstDayOfWeekDateTimeInMonth(DayOfWeek.Monday);Assert.Equal(new DateTime(2024, 11, 4), day_monday_monday);//验证当前日期是周日,并且在本月第一个周一之后的情况var sunday_monday = new DateTime(2024, 11, 30, 4, 10, 10);var day_sunday_monday = sunday_monday.GetFirstDayOfWeekDateTimeInMonth(DayOfWeek.Monday);Assert.Equal(new DateTime(2024, 11, 4), day_sunday_monday);//验证当前日期是周五,并且在本月第一个周日之前的情况var friday_sunday = new DateTime(2024, 11, 1, 14, 10, 10);var day_friday_sunday = friday_sunday.GetFirstDayOfWeekDateTimeInMonth(DayOfWeek.Sunday);Assert.Equal(new DateTime(2024, 11, 3), day_friday_sunday);//验证当前日期是本月第一个周日的情况var sunday_sunday = new DateTime(2024, 11, 30, 4, 10, 10);var day_sunday_sunday = sunday_sunday.GetFirstDayOfWeekDateTimeInMonth(DayOfWeek.Sunday);Assert.Equal(new DateTime(2024, 11, 3), day_sunday_sunday);//验证当前日期是周一,并且在本月第一个周日之后的情况var monday_sunday = new DateTime(2024, 11, 4, 4, 10, 10);var day_monday_sunday = monday_sunday.GetFirstDayOfWeekDateTimeInMonth(DayOfWeek.Sunday);Assert.Equal(new DateTime(2024, 11, 3), day_monday_sunday);
}

02、获取当前日期所在月的最后一个指定星期几

该方法和上一个求第一个指定星期几核心思想是一样的,具体代码如下:

//获取当前日期所在月的最后一个指定星期几
public static DateTime GetLastDayOfWeekDateTimeInMonth(this DateTime dateTime, DayOfWeek dayOfWeek)
{//获取当前日期所在月的最后一天var lastDayOfMonth = dateTime.GetLastDayDateTimeOfMonth();//计算目标日期与当月最后一天相差天数var diff = ((int)lastDayOfMonth.DayOfWeek - (int)dayOfWeek + 7) % 7;return lastDayOfMonth.AddDays(-diff);
}

单元测试可以参考求第一个指定星期几,这里就不赘述了。

03、获取当前日期上一个指定星期几

求上一个指定周几,其实也不复杂,首先计算出当前日期与目标星期几相差的天数,其中有个小细节需要注意,就是如果两个日期相同,则需要把相差天数改为7,具体代码如下:

//获取当前日期上一个指定星期几
public static DateTime GetPreviousDayDateTimeOfWeek(this DateTime dateTime, DayOfWeek dayOfWeek)
{//计算当前日期与目标星期几相差天数var diff = ((int)dateTime.DayOfWeek - (int)dayOfWeek + 7) % 7;//如果相差0天表示当前日期和目标星期几相同,需要改为7diff = diff == 0 ? 7 : diff;return dateTime.AddDays(-diff).Date;
}

我们分别对以下四种情况做单元测试:

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

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

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

(4) 验证当前日期是周六,并且是当月最后一天的情况;

具体代码如下:

[Fact]
public void GetPreviousDayDateTimeOfWeek()
{//验证当前日期是周一,而上一个周一在上一月的情况var monday = new DateTime(2024, 11, 1, 14, 10, 10);var day_monday = monday.GetPreviousDayDateTimeOfWeek(DayOfWeek.Monday);Assert.Equal(new DateTime(2024, 10, 28), day_monday);//验证当前日期是周一,而上一个周一在当月的情况var monday1 = new DateTime(2024, 11, 25, 14, 10, 10);var day_monday1 = monday1.GetPreviousDayDateTimeOfWeek(DayOfWeek.Monday);Assert.Equal(new DateTime(2024, 11, 18), day_monday1);//验证当前日期是周日,而上一个周一在当月的情况var sunday = new DateTime(2024, 11, 24, 4, 10, 10);var day_sunday = sunday.GetPreviousDayDateTimeOfWeek(DayOfWeek.Monday);Assert.Equal(new DateTime(2024, 11, 18), day_sunday);//验证当前日期是周六,并且是当月最后一天的情况var saturday = new DateTime(2024, 11, 30, 4, 10, 10);var day_saturday = saturday.GetPreviousDayDateTimeOfWeek(DayOfWeek.Monday);Assert.Equal(new DateTime(2024, 11, 25), day_saturday);
}

04、获取当前日期下一个指定星期几

该方法和上面获取上一个指定星期几核心思想相同,具体代码如下:

//获取当前日期下一个最近指定星期几
public static DateTime GetNextDayDateTimeOfWeek(this DateTime dateTime, DayOfWeek dayOfWeek)
{//计算目标日期与当月最后一天相差天数var diff = ((int)dayOfWeek - (int)dateTime.DayOfWeek + 7) % 7;//如果相差0天表示当前日期和目标星期几相同,需要改为7diff = diff == 0 ? 7 : diff;return dateTime.AddDays(diff).Date;
}

单元测试也可以参考求上一个指定星期几,这里就不再赘述了。

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,具体实现代码如下:

//获取当前日期是其所在月的第几周
public static int GetWeekOfMonth(this DateTime dateTime)
{//获取当前日期所在月的第一天var firstDayOfMonth = dateTime.GetFirstDayDateTimeOfMonth();//首先设定周一为一周的开始//计算当前月第一天与周一相差天数//即第一周如果不满一周还差多少天var diff = ((int)firstDayOfMonth.DayOfWeek - (int)DayOfWeek.Monday + 7) % 7;//用第一周不满的差值加上当前日期的天数之和计算当前为当月第几周//然后计算 总天数/7的商,如果有余数则再加1//公式为:n/7 + (n%7 > 0 ? 1 : 0)//上面公式可以简化为 (n+6)/7return (diff + dateTime.Day + 6) / 7;
}

下面我们对其进行以下几种情况详细的单元测试:

(1) 验证当前日期是周五,且是当月第一天的情况;

(2) 验证当前日期是周日,且在当月第一周的情况;

(3) 验证当前日期是周一,且在当月第三周的情况;

(4) 验证当前日期是周日,且在当月第三周的情况;

(5) 验证当前日期是周六,且是当月最后一天的情况;

具体代码如下:

[Fact]
public void GetWeekOfMonth()
{//验证当前日期是周五,且是当月第一天的情况var friday = new DateTime(2024, 11, 1, 14, 10, 10);var day_friday = friday.GetWeekOfMonth();Assert.Equal(1, day_friday);//验证当前日期是周日,且在当月第一周的情况var sunday = new DateTime(2024, 11, 3, 14, 10, 10);var day_sunday = sunday.GetWeekOfMonth();Assert.Equal(1, day_sunday);//验证当前日期是周一,且在当月第三周的情况var monday = new DateTime(2024, 11, 11, 4, 10, 10);var day_monday = monday.GetWeekOfMonth();Assert.Equal(3, day_monday);//验证当前日期是周日,且在当月第三周的情况var date17 = new DateTime(2024, 11, 17, 4, 10, 10);var day17 = date17.GetWeekOfMonth();Assert.Equal(3, day17);//验证当前日期是周六,且是当月最后一天的情况var sunday1 = new DateTime(2024, 11, 30, 4, 10, 10);var day_sunday1 = sunday1.GetWeekOfMonth();Assert.Equal(5, day_sunday1);
}

06、获取当前日期是其所在年的第几周(ISO 8601 标准)

在ISO 8601 标准规定中,每周从星期一开始,且每年最少有 52 周,每年的第一周是包含该年第一天的那一周,且该周必须至少有四天。

获取当然日期所在年的第几周可以通过调用C#中文化信息中日历组件中GetWeekOfYear方法,具体代码如下:

//获取当前日期是其所在年的第几周(ISO 8601 标准)
public static int GetWeekOfYear(this DateTime dateTime)
{var currentCulture = CultureInfo.CurrentCulture;return currentCulture.Calendar.GetWeekOfYear(dateTime, currentCulture.DateTimeFormat.CalendarWeekRule, currentCulture.DateTimeFormat.FirstDayOfWeek);
}

07、获取当前日期所在月份的周数

该方法实现的核心思想是首先获取当前日期所在月份的第一天和最后一天,然后分别计算其所在当年第几周,最后相减即可得到,具体代码如下:

//获取当前日期所在月份的周数
public static int GetWeeksInMonth(this DateTime dateTime)
{//获取当前日期所在月的第一天var firstDayOfMonth = dateTime.GetFirstDayDateTimeOfMonth();//获取当前日期所在月的最后一天var lastDayOfMonth = dateTime.GetLastDayDateTimeOfMonth();//获取当月第一天在全年中的周数var firstWeek = firstDayOfMonth.GetWeekOfYear();//获取当月最后一天在全年中的周数var lastWeek = lastDayOfMonth.GetWeekOfYear();return lastWeek - firstWeek + 1;
}

08、判断当前日期是否是周末

该方法比较简单,只是判断当前是否是否为周六或周日,具体代码如下:

//判断当前日期是否是周末
public static bool IsWeekend(this DateTime dateTime)
{return dateTime.DayOfWeek == DayOfWeek.Saturday || dateTime.DayOfWeek == DayOfWeek.Sunday;
}

09、判断当前日期所在年是否是闰年

该方法调用了C#内置方法IsLeapYear,具体代码如下:

//判断当前日期所在年是否是闰年
public static bool IsLeapYear(this DateTime dateTime)
{return DateTime.IsLeapYear(dateTime.Year);
}

10、获取当前日期所在季度

该方法也比较简单,只需要应用一个小公式即可求的,具体代码如下:

//获取当前日期所在季度
public static int GetQuarter(this DateTime dateTime)
{return (dateTime.Month - 1) / 3 + 1;
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Python练习18

Python日常练习 题目: 请编fun函数,求44整型数组的主对角线元素的和。 说明: 如下图所示为一个44整型数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 测试用例: 1 2 3 4 5 6 7 8…

智防未戴帽,安全无死角

在追求高效与安全并重的现代工业环境中,员工佩戴安全帽作为最基本的防护措施,其重要性不言而喻。为了有效杜绝员工未佩戴安全帽的现象,我们提出了一套以AI视频分析与安全教育培训系统为核心的综合解决方案,旨在通过智能化手段与系…

C++ 优先算法 —— 四数之和(双指针)

目录 题目:四数之和 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 双指针算法 不漏的处理: 去重处理: 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 双指针算法 题目:四数之和 1. 题目解析 题目截图: 这道题与三数之和&am…

[vulnhub] Corrosion: 2

https://www.vulnhub.com/entry/corrosion-2,745/ 提示:枚举才是神 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的,所以靶机IP是6 ,kali是10 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) …

前端请求后端php接口跨域 cors问题

只需要后端在网站的入口文件 一般都是 index.php 加上 这几行代码就可以了 具体的参数可以根据需要去修改 header("Access-Control-Allow-Origin: *"); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Heade…

【星闪EBM-H63开发板】AT固件的配置与测试

引言 前面的博客已经介绍了【星闪EBM-H63开发板】小熊派固件中心的使用_bearpi-bm h63固件烧录工具-CSDN博客和【星闪EBM-H63开发板】固件的烧录-CSDN博客,今天来测试一下另一种固件,也就是AT固件。有关AT固件的介绍参见:【星闪EBM-H63开发板…

Linux基础(十四)——BASH

BASH 1.BASH定义2.shell的种类3.bash的功能3.1 命令记录功能3.2 命令补全功能3.3 命令别名设置3.4 工作控制、 前景背景控制3.5 程序化脚本: ( shell scripts)3.6 万用字符 4.bash的内置命令5.shell的变量功能5.1 变量的取用5.2 新建变量5.3 …

【前端学习笔记】JavaScript学习一【变量与数据类型】

一、变量 变量是计算机中用来存储数据的“容器”,通俗的理解变量就是使用【某个符号】来代表【某个具体的数值】(数据) 声明:声明(定义)变量有两部分构成:关键字 变量名 JavaScript 使用关键字 let 和 var 来声明&am…

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹? 如果觉得博主写的还可以,点赞收藏关注噢~ 第一步:拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后,点击按钮创建…

Linux kernel 堆溢出利用方法(二)

前言 本文我们通过我们的老朋友heap_bof来讲解Linux kernel中off-by-null的利用手法。在通过讲解另一道相对来说比较困难的kernel off-by-null docker escape来深入了解这种漏洞的利用手法。(没了解过docker逃逸的朋友也可以看懂,毕竟有了root权限后&a…

福昕阅读器高级版解决文件上传IEEE PDF eXpress字体未嵌入

文件上传IEEE PDF eXpress字体未嵌入问题 Errors: Font Arial-BoldMT, Arial-ItalicMT, ArialMT is not embedded (93x on pages 2-3,5) 因为没安装adobe,尝试使用福昕阅读器高级版解决(学校统一买的,不知道普通版行不行) 找到潜…

人工智能在智能家居的应用

AI 在智能家居场景中,一方面将进一步推动家居生活产品的智能化,包 括照明系统、音箱系统、能源管理系统、安防系统等,实现家居产品从感知到认知再到决策的 发展;另一方面在于智能家居系统的建立,搭载人工智能的多款产品…

如何管理好自己的LabVIEW项目

在LabVIEW项目开发中,项目管理对于提高开发效率、确保项目质量、减少错误和维护成本至关重要。以下从项目规划、代码管理、测试与调试、版本控制、团队协作等方面,分享LabVIEW项目管理的体会。 ​ 1. 项目规划与需求分析 关键步骤: 需求分析…

51c自动驾驶~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11638131 #端到端任务 说起端到端,每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点!特斯拉率先吹响了方案更新的号角,无论是完全端到端,还是专注于planner的模型&a…

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器,将OpenCV中lib库里的o…

蓝牙音响音频功放:【矽源特HAA9809 AB+D类自动切换】

目录 1:HAA9809特性 2:典型应用电路 3:CTRL管脚控制信息 4:一线脉冲控制方式 5:输入电阻,调节放大增益 6:输入电容,调节频响 7:总结 矽源特ChipSourceTek-HAA9809…

大语言模型安全,到底是什么的安全

什么是AI安全 自ChatGPT问世以来,市场上涌现出了众多大型语言模型和多样化的AI应用。这些应用和模型在为我们的生活带来便利的同时,也不可避免地面临着安全挑战。AI安全,即人工智能安全,涉及在人工智能系统的开发、部署和使用全过…

云岚到家 秒杀抢购

目录 秒杀抢购业务特点 常用技术方案 抢券 抢券界面 进行抢券 我的优惠券列表 活动查询 系统设计 活动查询分析 活动查询界面显示了哪些数据? 面向高并发如何提高活动查询性能? 如何保证缓存一致性? 数据流 Redis数据结构设计 如…

餐饮点餐系统(2)

今天我们继续完成我们的项目,本次的目标是为每一个分支选项,创建菜单。 分析:1.首先我们要为每一个分支选项创建一个函数 2.其次是调用我们创建的函数 3.最后创建的自定义函数中会用到,while语句,switch语句&#xff…

某军工变压器企业:通过集团级工业IOT平台,实现数字化转型

概述 近年来,随着全球电力需求的增长和智能电网的推进,变压器市场规模持续扩大。2023年,全球配电变压器市场规模达到143.21亿美元,同比增长8.12%。中国配电变压器市场规模在2023年达到194.35亿元,同比增长14.53%‌。此…