假设两个日期
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 ....
答案 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:只是解释我使用的概念:
计算两个给定日期之间的所有天数&gt;这是我们的最终计数器
现在将一天增加到startDate
并同时检查日期是否属于给定日期,让我们说星期一(我使用switch
案例)。如果是,则将date
添加到字典中,并将loop #no
添加为索引以便稍后使用。循环直到我们点击计数器。
现在,对于我们Dictionary
中的所有条目,如果索引可以被给定的第N个周检查数除尽,则获取日期。
那就是它!
编辑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);
}
输出:
希望你现在可能有了这个想法
答案 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;
}
}
}
}
}