C# 技巧:日期时间扩展

作者:微信公众号:【架构师老卢】
7-4 18:7
44

概述:不久前,我需要编写一个显示当前周开始和结束日期的方法。这让我开始思考其他时间段,如天、月、季度和年。以及如何找到它们的开始和结束日期。因此,由于我喜欢来自我的开发人员同事的验证,我想与您分享。Days Years日子和年份很容易处理,因为它们有明确的开始和结束。public static DateTime StartOfDay(this DateTime date)  {     return date.Date;  }  public static DateTime EndOfDay(this DateTime date)  {     return new DateTim

不久前,我需要编写一个显示当前周开始和结束日期的方法。这让我开始思考其他时间段,如天、月、季度和年。以及如何找到它们的开始和结束日期。
因此,由于我喜欢来自我的开发人员同事的验证,我想与您分享。

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

阅读排行