C# 技巧:如何确定日期时间范围的日周月季度半年

简介: C# 技巧:如何确定日期时间范围的日周月季度半年

现在有个项目我需要编写一个显示当前周开始和结束日期的方法。这让我开始思考其他时间段,如天、月、季度和年。以及如何找到它们的开始和结束日期。

因此,由于我喜欢来自我的开发人员同事的验证,我想与您分享。

Days & Years

日子和年份很容易处理,因为它们有明确的开始和结束。

public static DateTime StartOfDay(this DateTime date)   
{   
   return date.Date;   
}   
  
public static DateTime EndOfDay(this DateTime date)   
{   
   return new DateTime(date.Year, date.Month, date.Day, 23, 59, 59);   
}

要找到一天的开始,我们只需要返回 DateTime 的 Date 属性,这将为我们提供时间设置为 00:00:00 的日期。

对于时间结束时,我们创建一个具有相同日期的新 DateTime 对象,但将时间设置为 23:59:59。

public static DateTime StartOfYear(this DateTime date)   
{   
  return new DateTime(date.Year, 1, 1);   
}   
  
public static DateTime EndOfYear(this DateTime date)   
{   
  return new DateTime(date.Year, 12, 31, 23, 59, 59);   
}

对于一年的开始,我们创建一个具有相同年份的新 DateTime 对象,但首先将月份和日期设置为 1 月。

对于一年的年底,我们创建一个具有相同年份的新 DateTime 对象,但将月份和日期设置为 12 月 31 日,并将时间设置为 23:59:59。

Week

public static DateTime StartOfWeek(this DateTime date,  
 DayOfWeek startOfWeekDay = DayOfWeek.Sunday)   
{   
  while (date.DayOfWeek != startOfWeekDay)   
  {   
      date = date.AddDays(-1);   
  }   
  return date;   
}   
  
public static DateTime EndOfWeek(this DateTime date,  
 DayOfWeek startOfWeekDay = DayOfWeek.Sunday)   
{   
  return date.StartOfWeek(startOfWeekDay).AddDays(7).AddSeconds(-1);   
}

几周来,我们需要考虑一些我们大多数人认为理所当然的事情:我们什么时候开始一周?

在美国和欧洲,工作周从星期一开始,但在世界其他地区(如以色列),工作周从星期日开始。因此,我们需要有一个选项来处理这两种情况,通过使用 DayOfWeek startOfWeekDay 参数来判断一周的第一天是什么。

为了找到一周的开始,我们从当前日期开始,一次返回一天,直到我们到达一周开始的那一天。

要找到一周的结束,我们首先找到一周的开始,然后加上 7 天(到下周的开始),然后回溯 1 秒(到本周的最后一秒)。

Months

public static DateTime StartOfMonth(this DateTime date)   
{   
  return new DateTime(date.Year, date.Month, 1);   
}   
  
public static DateTime EndOfMonth(this DateTime date)   
{   
  return new DateTime(date.Year, date.Month,   
             DateTime.DaysInMonth(date.Year, date.Month), 23, 59, 59);   
}

对于月初,我们创建一个新的 DateTime 对象,该对象具有相同的年份和月份,但将日期设置为 1。

月底有点棘手,因为并非所有月份都有相同的天数,但 DateTime 为我们提供了 DaysInMonth 方法。因此,我们创建一个具有相同年份和月份的新 DateTime 对象,但将月份和日期设置为 _DateTime.DaysInMonth(date.年、日。月)。_我们将时间设置为 23:59:59。

Quarters

public static int QuarterOfTheYear(this DateTime date)   
{   
  return (int)Math.Ceiling((double)date.Month / 3);   
}   
  
public static DateTime StartOfQuarter(this DateTime date)   
{   
  var finalMonthOfQuarter= date.QuarterOfTheYear() * 3;   
  return new DateTime(date.Year, finalMonthOfQuarter— 2, 1);   
}   
  
public static DateTime EndOfQuarter(this DateTime date)   
{   
  var finalMonthOfQuarter = date.QuarterOfTheYear() * 3;   
  return new DateTime(date.Year, finalMonthOfQuatr,   
          DateTime.DaysInMonth(date.Year, finalMonthOfQuarter), 23, 59, 59);   
}

对于季度,我首先需要一种方法来告诉我们我们处于一年中的哪个季度,我们通过将月份除以 3 并使用 Math.Ceiling 四舍五入到最接近的整数来实现这一点。例如:如果我们在 2 月份,我们做 2/3 并得到 0.66,我们四舍五入到 1,看到 2 月份在第一季度。如果我们在 8 月份,我们做 8/3 并得到 2.66,我们将其四舍五入为 3,看到 8 月处于第 3 季度。

要找到季度的开始,我们只需要找到第一个月,我们通过找到最后一个月(季度数乘以 3 )然后回到 2 个月来做到这一点。假设我们处于最后一个季度,4*3 让我们到达 12 月(第 12 个月),如果我们回到 2 个月,我们将到达 10 月。

为了找到季度末,我们使用类似的技术,并将其与我们过去查找一个月天数的方法相结合。


目录
相关文章
|
7月前
|
存储 安全 Unix
C#.Net筑基-类型系统②常见类型--日期和时间的故事
在System命名空间中,有几种表示日期时间的不可变结构体(Struct):DateTime、DateTimeOffset、TimeSpan、DateOnly和TimeOnly。DateTime包含当前本地或UTC时间,以及最小和最大值;DateTimeOffset增加了时区偏移信息,适合跨时区操作。UTC是世界标准时间,而格林尼治标准时间(GMT)不稳定,已被更精确的UTC取代。DateTimeOffset和DateTime提供了转换为UTC和本地时间的方法,以及各种解析和格式化函数。
C# 对于“日期时间(DateTime)“的处理 时间差计算
C# 对于“日期时间(DateTime)“的处理 时间差计算
|
C#
C# 两个DataGridView设置时间范围,开始日期小于结束日期
C# 两个DataGridView设置时间范围,开始日期小于结束日期
110 0
【C#每日一题】输入任意一个日期显示出它是当年的第几天?星期几?并打印出当月的日历
作业1:输入任意一个日期显示出它是当年的第几天?星期几?并打印出当月的日历 运行结果: 上代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { .
167 0
【C#每日一题】输入任意一个日期显示出它是当年的第几天?星期几?并打印出当月的日历
|
C#
c#日期格式转换大全
c#日期格式转换大全
124 0
C# 计算两个日期的时间间隔
C# 计算两个日期的时间间隔
661 0
C# string格式的日期时间转为DateTime类型
C# string格式的日期时间转为DateTime类型
391 0
|
C# 前端开发
【C#】wpf自定义calendar日期选择控件的样式
原文:【C#】wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 1. 总览: Calendar本质上是一个6x7的列表,这个列表可以用ItemsControl来实现。
1126 0
|
C#
C#根据当前时间获取周,月,季度,年度等时间段的起止时间
原文:C#根据当前时间获取周,月,季度,年度等时间段的起止时间 最近有个统计分布的需求,需要按统计本周,上周,本月,上月,本季度,上季度,本年度,上年度等时间统计分布趋势,所以这里就涉及到计算周,月,季度,年度等的起止时间了,下面总结一下C#中关于根据当前时间获取周,月,季度,年度等时间段的起止时间的方法,废话不多说,直接贴代码,如果你觉得有用,请多多推荐。
1416 0
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
32 3