如何计算2个日期的周数?

我有两个DateTime变量,我需要计算它们之间的周数。

这样做最快(最正确)的方法是什么?

使用TimeSpan

 double weeks = (date1 - date2).TotalDays / 7; 

您可以尝试以下方法:

 DateTime d1 = new DateTime(2006,10,1); DateTime d2 = new DateTime(2007,10,15); TimeSpan tt = d2 - d1; int totalWeeks = tt.Days/7; 

如果你想要分数的确切差异,那么而不是:

 int totalWeeks = tt.Days/7; 

使用:

 double totalWeeks = tt.TotalDays/7; 

更新 :试试这个库: http : //www.codeproject.com/Articles/168662/Time-Period-Library-for-NET作者已经找到了解决所有这些细节的方法。

我没有看到真正定义一周是什么的答案。

这是陷阱,并非所有周都是平等的。 有些计算星期一,而其他星期四​​计算。

以本月为例。 如果我想计算2012年8月的周数,我可以做以下事情:

 var date1 = new DateTime(2012,8,1); var date2 = new DateTime(2012,8,31); var weeks = (date1 - date2).TotalDays / 7; 

首先,.TotalDays给了我们一个双倍:周== 4.2857 ……

我们可以绕,但有时你会超过数。 其他时候你会失败。

计数周通常依赖于定义一周开始和结束的时间。 使用DateTime对象,我们会发现每周都在星期一开始。

广泛使用的ISO8601标准定义从星期四开始的一周。 所以两个日期之间的周数取决于星期四的发生次数。

使用GregorianCalendar类实现类似的东西:

 using System; using System.Globalization; using FluentAssertions; using NUnit.Framework; //...Namespace, test fixture class, etc ... [Test] public void GetMetricsTimesBetween_ReturnsCorrectRange() { DateTime startDate = new DateTime(2012, 8, 1); DateTime endDate = new DateTime(2012, 8, 31); var cal = new GregorianCalendar(); int startWeekNumber = cal.GetWeekOfYear(startDate, CalendarWeekRule.FirstDay, DayOfWeek.Thursday); int endWeekNumber = cal.GetWeekOfYear(endDate, CalendarWeekRule.FirstDay, DayOfWeek.Thursday); int numberOfWeeksInRange = endWeekNumber - startWeekNumber; numberOfWeeksInRange.Should().Be(5); } 

这应该会给你更可靠的结果。 你必须考虑这个例子假设我们在同一年内计算数周。 通过一些额外的工作,您可以帮助计算处理跨越不同年份的日期范围:

 [Test] public void GetCountOfWeeks() { var startDate = new DateTime(2012, 12, 1); // 4 weeks here var endDate = new DateTime(2014, 1, 10); // 52 in 2013 and 2 weeks in 2014 int numberOfWeeksInRange = 0; var cal = new GregorianCalendar(); for (int year = startDate.Year; year <= endDate.Year; year++) { int startWeekNumber = 0; int endWeekNumber= 0; if(year == startDate.Year) { // start date through the end of the year startWeekNumber = cal.GetWeekOfYear(startDate, CalendarWeekRule.FirstDay, DayOfWeek.Thursday); endWeekNumber = cal.GetWeekOfYear(( new DateTime(year + 1, 1, 1).AddDays(-1)), CalendarWeekRule.FirstDay, DayOfWeek.Thursday); } else if(year == endDate.Year) { // start of the given year through the end date startWeekNumber = cal.GetWeekOfYear((new DateTime(year, 1, 1)), CalendarWeekRule.FirstDay, DayOfWeek.Thursday); endWeekNumber = cal.GetWeekOfYear(endDate, CalendarWeekRule.FirstDay, DayOfWeek.Thursday); } else { // calculate the number of weeks in a full year startWeekNumber = cal.GetWeekOfYear(new DateTime(year, 1, 1), CalendarWeekRule.FirstDay, DayOfWeek.Thursday); endWeekNumber = cal.GetWeekOfYear(( new DateTime(year + 1, 1, 1).AddDays(-1)), CalendarWeekRule.FirstDay, DayOfWeek.Thursday); } numberOfWeeksInRange += endWeekNumber - startWeekNumber; } numberOfWeeksInRange.Should().Be(58); } 

这仍然不完美,但它更接近。 这里的要点是,如果你想获得像“周”这样的东西的真实计数,它并不像我们倾向于那样简单,这实际上更像是一个特定于区域的决定,而不是像1 + 1那样的标准科学表达式2.总天数除以7就像所谓的“工作日”是9到5一样含糊不清......

这是一个更好的例子。 当然,仍然可以使用重构,但是作为GregorianCalendar类的扩展,在同一年和跨越多年处理日期范围:

 ///  /// Returns the number of weeks between two datetimes ///  ///  ///  ///  ///  public static int GetWeeks(this GregorianCalendar cal, CalendarWeekRule weekRule, DayOfWeek dayofWeek, DateTime startDate, DateTime endDate) { int startWeekNumber = 0; int endWeekNumber = 0; int numberOfWeeksInRange = 0; if (startDate.Year == endDate.Year) { startWeekNumber = 0; endWeekNumber = 0; startWeekNumber = cal.GetWeekOfYear(startDate, weekRule, dayofWeek); endWeekNumber = cal.GetWeekOfYear(endDate, weekRule, dayofWeek); numberOfWeeksInRange = endWeekNumber - startWeekNumber; } else { // calculate per year, inclusive for (int year = startDate.Year; year <= endDate.Year; year++) { startWeekNumber = 0; endWeekNumber = 0; if (year == startDate.Year) { // start date through the end of the year startWeekNumber = cal.GetWeekOfYear(startDate, weekRule, dayofWeek); endWeekNumber = cal.GetWeekOfYear((new DateTime(year + 1, 1, 1).AddDays(-1)), weekRule, dayofWeek); } else if (year == endDate.Year) { // start of the given year through the end date startWeekNumber = cal.GetWeekOfYear((new DateTime(year, 1, 1)), weekRule, dayofWeek); endWeekNumber = cal.GetWeekOfYear(endDate, weekRule, dayofWeek); } else { // calculate the total number of weeks in this year startWeekNumber = cal.GetWeekOfYear(new DateTime(year, 1, 1), weekRule, dayofWeek); endWeekNumber = cal.GetWeekOfYear((new DateTime(year + 1, 1, 1).AddDays(-1)), weekRule, dayofWeek; } numberOfWeeksInRange += endWeekNumber - startWeekNumber; } } return numberOfWeeksInRange; } 
 (dtTo - dtFrom).TotalDays / 7 

会给出几周的时间

 public static int NumberOfWeeks(DateTime dateFrom, DateTime dateTo) { TimeSpan Span = dateTo.Subtract(dateFrom); if (Span.Days <= 7) { if (dateFrom.DayOfWeek > dateTo.DayOfWeek) { return 2; } return 1; } int Days = Span.Days - 7 + (int)dateFrom.DayOfWeek; int WeekCount = 1; int DayCount = 0; for (WeekCount = 1; DayCount < Days; WeekCount++) { DayCount += 7; } return WeekCount; } 

你可以尝试类似的东西:

 var d1 = new DateTime(2011, 01, 05); var d2 = new DateTime(2010, 01, 05); Console.WriteLine((d1 - d2).Days / 7); 

您可能需要根据您的具体要求向上或向下舍入结果,但这应该可以解决问题。

如果你尝试将divise转换为整数,它将无法工作。 你必须分成两倍。

 DateTime startDateTime = new DateTime(2010, 8, 1); DateTime endDateTime = new DateTime(2010, 8, 28); double weeks = (endDateTime - startDateTime).TotalDays / 7;