我正在使用C#开发Asp.net项目。我在这个项目中遇到了问题。此任务基于根据条件安排的服务。
问题:
日期的两个文本框,一个类型
的下拉列表首先,我根据生成预定的类型选择了两个日期。
例如:
我已选择日期14/03/2014
至14/6/2014
并输入Monthly
每月意味着增加1个月的价值
所以输出应该是这样的
14/04/2014
14/05/2014
14/06/2014
在两个日期范围之间安排了三个日期
问题:
如何完成这项任务?
抱歉英语不好.....
答案 0 :(得分:0)
一次循环和添加一个月应该可以正常工作
public IEnumerable<DateTime> GenerateDates(DateTime start, DateTime end)
{
var dates = new List<DateTime>();
var date = new DateTime(start.Year, start.Month, start.Day);
while (date.Month <= end.Month && date.Year <= end.Year)
{
date = date.AddMonths(1);
dates.Add(date);
}
return dates;
}
答案 1 :(得分:0)
var listDates = GetDates(new DateTime(2014, 3, 14), new DateTime(2014, 6, 14), "Day").ToList();
public IEnumerable<DateTime> GetDates(DateTime from, DateTime to,string type)
{
switch (type)
{
case "Month":
{
for (var dt = from.AddMonths(1); dt <= to; dt=dt.AddMonths(1))
{
yield return dt;
}
break;
}
case "Day":
{
for (var dt = from.AddDays(1); dt <= to; dt = dt.AddDays(1))
{
yield return dt;
}
break;
}
}
}
如果您需要在结果中加入'14/03/2014'
,只需从for循环中删除from.AddMonths(1)
答案 2 :(得分:0)
根据您的问题,我假设有几种模式,而不仅仅是MONTHLY
。因此,我建议添加一个注册表,其中包含可能的模式和用于确定下一个日期的函数。如果您想提供更多模式,则可以轻松扩展此注册表。该示例使用字符串键,但您也可以使用枚举。
现在实施时,开始日期包含在日期列表中,而结束日期则不包括在日期列表中。您可以通过调整while
循环来改变这种情况。
class ScheduleDateProvider
{
private static readonly Dictionary<string, Func<DateTime, DateTime>> modesDict;
static ScheduleDateProvider()
{
// Register modes
modesDict = new Dictionary<string, Func<DateTime, DateTime>>();
modesDict.Add("Quaterly", (dt) => dt.AddMonths(3) );
modesDict.Add("Monthly", (dt) => dt.AddMonths(1) );
modesDict.Add("Weekly", (dt) => dt.AddDays(7) );
modesDict.Add("Daily", (dt) => dt.AddDays(1) );
}
public IEnumerable<DateTime> GetDatesInRange(DateTime startDate, DateTime endDate, string mode)
{
// Assemble dates in a list
var getNextDateFct = modesDict[mode];
var lst = new List<DateTime>();
while(startDate < endDate)
{
lst.Add(startDate);
startDate = getNextDateFct(startDate);
}
return lst.AsReadOnly();
}
}
以下代码显示了如何使用代码:
void Main()
{
DateTime startDate = DateTime.Today;
DateTime endDate = DateTime.Today.AddYears(1);
string selectedMode = "Monthly";
var scheduleDateProv = new ScheduleDateProvider();
var dates = scheduleDateProv.GetDatesInRange(startDate, endDate, selectedMode);
foreach(var dt in dates)
Console.WriteLine(dt.ToShortDateString());
}