C# 如何计算给定两个日期的周数?

C# 如何计算给定两个日期的周数?,c#,datetime,C#,Datetime,我有两个DateTime变量,我需要计算它们之间的周数 最快(正确)的方法是什么?使用: 您可以尝试以下方法: 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; 使用: 将给出周数公共静态整

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

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

使用:


您可以尝试以下方法:

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;
使用:

将给出周数

公共静态整数周数(DateTime dateFrom,DateTime dateTo)
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;
}
{ TimeSpan=dateTo.Subtract(dateFrom); 如果(从Span.Days dateTo.DayOfWeek) { 返回2; } 返回1; } int Days=Span.Days-7+(int)dateFrom.DayOfWeek; int WeekCount=1; int DayCount=0; 对于(WeekCount=1;DayCount<天;WeekCount++) { 日数+=7; } 返回WeekCount; }
您可以尝试以下方法:

var d1 = new DateTime(2011, 01, 05);
var d2 = new DateTime(2010, 01, 05);

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

您可能需要根据您的具体要求对结果进行上下舍入,但这应该可以做到。

如果您尝试将结果除数为整数,则不会起作用。你必须分成两份

DateTime startDateTime = new DateTime(2010, 8, 1);
DateTime endDateTime = new DateTime(2010, 8, 28);
double weeks = (endDateTime - startDateTime).TotalDays / 7;
更新:尝试此库: 作者想尽了很多办法来弄清所有这些细节

我没有看到一个真正定义一周的答案

这里有一个陷阱,不是所有的星期都是平等的。有些人计算星期一,而另一些人计算星期四

以这个月为例。如果我想计算2012年8月的周数,我可以这样做:

var d1 = new DateTime(2011, 01, 05);
var d2 = new DateTime(2010, 01, 05);

Console.WriteLine((d1 - d2).Days / 7);
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);
        }
/// <summary>
/// Returns the number of weeks between two datetimes
/// </summary>
/// <param name="cal"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
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;
}
这将为您提供更可靠的结果。你必须考虑这个例子假设我们在同一年内数周。通过一些额外的工作,您可以帮助计算处理跨越不同年份的日期范围:

[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);
} 
[测试]
public void GetCountOfWeeks(){
var startDate=new DateTime(2012,12,1);//此处为4周
var endDate=新日期时间(2014,1,10);//2013年52周,2014年2周
int numberOfWeeksInRange=0;
var cal=新的Gregorianalendar();

对于(int year=startDate.year;年份完整周数?如果是,一周从哪一天开始?或天数差/7?您如何定义正确?您能给出一些不同输入的预期结果的示例吗?请检查,我不知道在这个示例中使用了TimeSpan,我是否遗漏了什么?@Aeron-subtra的结果cTd日期彼此之间是一个<代码> TimeSpAs/COD>。上面的方法有1天的错误。它似乎不包括两个日期。考虑DATE1作为2016年8月1日和第二个日期作为2016年8月2日。减去后,您得到1天,但实际上有两天。@ SkyBog,但在这两个日期之间实际上是一天(24小时)。
/// <summary>
/// Returns the number of weeks between two datetimes
/// </summary>
/// <param name="cal"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
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;
}