如何在C#中找到给定日期范围的周数

时间:2014-08-11 16:09:36

标签: c# asp.net datetime

我需要在C#中找到给定日期范围的周数。

例如:2014年1月1日至2014年1月14日之间的日期同样,周数也是第1周,第2周和第3周。

感谢。

4 个答案:

答案 0 :(得分:2)

这应该有效:

public List<int> Weeks(DateTime start, DateTime end)
{
    List<int> weeks=new List<int>();
    var Week=(int)Math.Floor((double)start.DayOfYear/7.0); //starting week number
    for (DateTime t = start; t < end; t = t.AddDays(7))
    {
        weeks.Add(Week);
        Week++;
    }
    return weeks;
}

所有这一切都是获取开始日期的一周,然后一次循环一周,直到你到达结束日期,增加一周并将其添加到周列表。

答案 1 :(得分:1)

不是最聪明的方式,但有效!

  var d1 = new DateTime(2014, 1, 1);
  var d2 = new DateTime(2014, 1, 14);
  var currentCulture = CultureInfo.CurrentCulture;
  var weeks = new List<int>();

  for (var dt = d1; dt < d2; dt =dt.AddDays(1))
   {
      var weekNo = currentCulture.Calendar.GetWeekOfYear(
                            dt,
                            currentCulture.DateTimeFormat.CalendarWeekRule,
                            currentCulture.DateTimeFormat.FirstDayOfWeek);
       if(!weeks.Contains(weekNo))
         weeks.Add(weekNo);
  }

答案 2 :(得分:0)

好的,让我们从一个简单的,未经优化的例子开始。我们只是检查这些日期之间的每个日期,并检查一年中的哪一周。

我们可以用一个简单的循环来做到这一点:

var end = new DateTime(2014, 1, 14);
for (var date = new DateTime(2014, 1, 1); date <= end; date = date.AddDays(1))
{
}

这将简单地在两个日期之间循环。现在我们需要检查那些日子以确定他们的星期几。要做到这一点,你需要考虑一些事项:一周的第一天是什么?星期日?星期一?我们假设格里高利历吗?

对于我们的例子,让我们假设一周的第一天是星期日,我们确实使用公历。然后我们将检查每个日期,并使用HashSet

保留一年中唯一周的列表
var weekNumber = new HashSet<int>();
var end = new DateTime(2014, 1, 14);
var calendar = new GregorianCalendar();
for (var date = new DateTime(2014, 1, 1); date <= end; date = date.AddDays(1))
{
    weekNumber.Add(calendar.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday));
} 

weekNumber Hashset现在包含一年中的几周。

这是优化的吗?不会。它会检查的日期多于它需要的日期,但实施很简单且足够快。优化可以作为单独的任务完成。

答案 3 :(得分:0)

易。这是确定单个日期的一年中的一周的代码。这应该让你去:

int WeekOfYear(DateTime date, DayOfWeek dayOfWeekStart) {
    //Find the first day of the year that's the start of week day.  If it's not 1/1,
    //then we have a first partial week.
    bool firstPartialWeek = false;
    DateTime firstFullWeekStart = new DateTime(date.Year, 1, 1);
    while(firstFullWeekStart.DayOfWeekDay != dayOfWeekStart) {
        firstFullWeekStart = firstOfWeek.AddDays(1);
        firstPartialWeek = true;
    }
    //Return the week by integer dividing the date difference by seven,
    //and adding in the potential first partial week
    return (firstPartialWeek ? 1 : 0) + ((date - firstFullWeekStart).TotalDays / 7);

}