在.net中的两个日期之间生成服务计划

时间:2014-04-23 08:17:17

标签: c# asp.net

我正在使用C#开发Asp.net项目。我在这个项目中遇到了问题。此任务基于根据条件安排的服务。

问题:

日期的两个文本框,一个类型

的下拉列表

首先,我根据生成预定的类型选择了两个日期。

例如:

我已选择日期14/03/201414/6/2014并输入Monthly

每月意味着增加1个月的价值

所以输出应该是这样的

14/04/2014
14/05/2014
14/06/2014

在两个日期范围之间安排了三个日期

问题:

如何完成这项任务?

抱歉英语不好.....

3 个答案:

答案 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());
}