Подсчитать количество понедельников в заданном диапазоне дат - PullRequest
22 голосов
/ 29 октября 2008

Учитывая диапазон дат, мне нужно знать, сколько понедельников (или вторников, сред и т. Д.) В этом диапазоне.

Я сейчас работаю в C #.

Ответы [ 14 ]

1 голос
/ 29 октября 2008

Добавьте наименьшее возможное число, чтобы первый день стал понедельником. Вычтите наименьшее возможное число, чтобы сделать последний день понедельником. Рассчитайте разницу в днях и разделите на 7.

0 голосов
/ 27 января 2012

Четыре года спустя я решил провести тест:

[TestMethod]
public void ShouldFindFridaysInTimeSpan()
{
    //reference: /218009/podschitat-kolichestvo-ponedelnikov-v-zadannom-diapazone-dat

    var spanOfSixtyDays = new TimeSpan(60, 0, 0, 0);
    var setOfDates = new List<DateTime>(spanOfSixtyDays.Days);
    var now = DateTime.Now;

    for(int i = 0; i < spanOfSixtyDays.Days; i++)
    {
        setOfDates.Add(now.AddDays(i));
    }

    Assert.IsTrue(setOfDates.Count == 60,
        "The expected number of days is not here.");

    var fridays = setOfDates.Where(i => i.DayOfWeek == DayOfWeek.Friday);

    Assert.IsTrue(fridays.Count() > 0,
        "The expected Friday days are not here.");
    Assert.IsTrue(fridays.First() == setOfDates.First(i => i.DayOfWeek == DayOfWeek.Friday),
        "The expected first Friday day is not here.");
    Assert.IsTrue(fridays.Last() == setOfDates.Last(i => i.DayOfWeek == DayOfWeek.Friday),
        "The expected last Friday day is not here.");
}

Мое использование TimeSpan немного излишне - на самом деле я хотел запросить TimeSpan напрямую.

0 голосов
/ 30 октября 2008
private System.Int32 CountDaysOfWeek(System.DayOfWeek dayOfWeek, System.DateTime date1, System.DateTime date2)
{
  System.DateTime EndDate;
  System.DateTime StartDate;

  if (date1 > date2)
  {
    StartDate = date2;
    EndDate = date1;
  }
  else
  {
    StartDate = date1;
    EndDate = date2;
  }

  while (StartDate.DayOfWeek != dayOfWeek)
    StartDate = StartDate.AddDays(1);

  return EndDate.Subtract(StartDate).Days / 7 + 1;
}
0 голосов
/ 29 октября 2008

У меня была похожая проблема для отчета. Мне нужно было количество рабочих дней между двумя датами. Я мог бы перебрать даты и посчитать, но мое дискретное обучение математике не позволило бы мне. Вот функция, которую я написал в VBA, чтобы получить количество рабочих дней между двумя датами. Я уверен, что .net имеет аналогичную функцию WeekDay.

   1  
   2  ' WorkDays
   3  ' returns the number of working days between two dates
   4  Public Function WorkDays(ByVal dtBegin As Date, ByVal dtEnd As Date) As Long
   5  
   6     Dim dtFirstSunday As Date
   7     Dim dtLastSaturday As Date
   8     Dim lngWorkDays As Long
   9  
  10     ' get first sunday in range
  11     dtFirstSunday = dtBegin + ((8 - Weekday(dtBegin)) Mod 7)
  12  
  13     ' get last saturday in range
  14     dtLastSaturday = dtEnd - (Weekday(dtEnd) Mod 7)
  15  
  16     ' get work days between first sunday and last saturday
  17     lngWorkDays = (((dtLastSaturday - dtFirstSunday) + 1) / 7) * 5
  18  
  19     ' if first sunday is not begin date
  20     If dtFirstSunday <> dtBegin Then
  21  
  22        ' assume first sunday is after begin date
  23        ' add workdays from begin date to first sunday
  24        lngWorkDays = lngWorkDays + (7 - Weekday(dtBegin))
  25  
  26     End If
  27  
  28     ' if last saturday is not end date
  29     If dtLastSaturday <> dtEnd Then
  30  
  31        ' assume last saturday is before end date
  32        ' add workdays from last saturday to end date
  33        lngWorkDays = lngWorkDays + (Weekday(dtEnd) - 1)
  34  
  35     End If
  36  
  37     ' return working days
  38     WorkDays = lngWorkDays
  39  
  40  End Function
...