获取与第n周的开始日期和结束日期相匹配的日期

时间:2017-07-20 17:09:23

标签: c# .net date datetime

假设两个日期

20/06/2017和20/10/2017

我有一个要求,我需要每隔n周获取开始日期和结束日期之间的天数匹配!!!!

例如: -

我从UI获得了一些输入,上面提到的开始日期和结束日期之间每隔一个星期一和星期四的第三周

我需要从20/7到10月20日每隔一个星期一和星期四进行一次日期

我该怎么做?

我现在写这个

private static List<DateTime> Get(DateTime startingDate,DateTime endingDate,int pattern)
{
    for (DateTime date = startingDate; date <= endingDate; date = date.AddDays(pattern))
        allDates.Add(date);

}

获取开始日期和结束日期,并为我提供与模式匹配的日期。例如: - 如果start = 20/07且end为30/07且模式为2,则返回22 / 07,24 / 07,26 / 07 ....

2 个答案:

答案 0 :(得分:1)

这是您的问题的简短解决方案

DateTime startDate = new DateTime(2017, 05, 1);
DateTime endDate = new DateTime(2017, 07, 21); 
Dictionary<int, string> DictionOfDates = new Dictionary<int, string>();
int weekNoCount = 3; //Every 3rd week
TimeSpan tsdiff = endDate - startDate;
int days = tsdiff.Days; //total #days in the difference from start to end
for (var i = 0; i <= days; i++)
{
    var date = startDate.AddDays(i);
    switch (date.DayOfWeek)
    {                
      case DayOfWeek.Monday:
           DictionOfDates.Add(i, date.ToShortDateString());
           break;
    }
}

foreach (var item in DictionOfDates)
{
   if (item.Key % weekNoCount == 0) //Check remainder is zero when divided by weekCount
       MessageBox.Show(item.Value); //prints the date which you want after the n'th week check
}

我想这里的一切都是不言自明的,但如果你有任何困惑,请继续评论。

编辑1:只是解释我使用的概念:

  1. 计算两个给定日期之间的所有天数&gt;这是我们的最终计数器

  2. 现在将一天增加到startDate并同时检查日期是否属于给定日期,让我们说星期一(我使用switch案例)。如果是,则将date添加到字典中,并将loop #no添加为索引以便稍后使用。循环直到我们点击计数器

  3. 现在,对于我们Dictionary中的所有条目,如果索引可以被给定的第N个周检查数除尽,则获取日期。

  4. 那就是它!

    编辑2:围绕它创建了一个方法,就像这样

    private void Form1_Load(object sender, EventArgs e)
    {
         DateTime startDate = new DateTime(2017, 05, 1);
         DateTime endDate = new DateTime(2017, 07, 21);
         int weekNoCount = 3; //Every 3rd week
         DayOfWeek[] days = new DayOfWeek[2] { DayOfWeek.Monday, DayOfWeek.Thursday }; //Pass required days here
         FetchTheDays(startDate, endDate, weekNoCount, days);
    }
    
    private void FetchTheDays(DateTime startDate, DateTime endDate, int weekNoCount, DayOfWeek[] daysofWeek)
    {
         Dictionary<int, DateTime> DictionOfDates = new Dictionary<int, DateTime>();
    
         TimeSpan tsdiff = endDate - startDate;
         int days = tsdiff.Days; //total #days in the difference from start to end
         for (var i = 0; i <= days; i++)
         {
             var date = startDate.AddDays(i);
             foreach (var weekday in daysofWeek)
             {
                 if (date.DayOfWeek == weekday)
                 DictionOfDates.Add(i, date);
             }
         }
    
         string testExample = "";
         foreach (var item in DictionOfDates)
         {
             if (item.Key % weekNoCount == 0) //Check remainder is zero when divided by weekCount
             testExample += (item.Value.ToShortDateString() + " (" + item.Value.DayOfWeek + ")" + "\n"); 
         }
    
         MessageBox.Show(testExample);
    }
    
      

    输出:

         

    OUTPUT

    希望你现在可能有了这个想法

答案 1 :(得分:0)

这可能是另一种方法。

using System;
using System.Collections.Generic;


namespace ConsoleApp3
{
class Program
{


    static void Main(string[] args)
    {
        var validDates = new List<DateTime>();
        getDates(new DateTime(17,7,20), new DateTime(17,10,20),new List<DayOfWeek> { DayOfWeek.Monday, DayOfWeek.Thursday },out validDates, 3);

        validDates.ForEach(date => Console.WriteLine(date.ToString("dd/MM")));
        Console.ReadKey();
    }

    static void getDates(DateTime startDate, DateTime endDate, List<DayOfWeek> daysOfTheWeek, out List<DateTime> validDates, int pattern)
    {
        validDates = new List<DateTime>();
        for (var i = startDate; i <= endDate; i=i.AddDays(7*(pattern-1)))
        {
            for (int j = 0; j < 7; j++)
            {
                if (daysOfTheWeek.Contains(i.DayOfWeek))
                {
                    validDates.Add(i);
                }
                i=i.AddDays(1);

                if (i >= endDate || i.DayOfWeek == DayOfWeek.Monday) //assuming you were counting weeks starting on Monday
                    break;
            }
        }

    }
}
}