2012-07-07 78 views
3

我有一个ASP.Net日历功能,它允许用户添加事件和 配置他们是否重复在不同的频率(即,每日,每周,每月,周六/日等等 ) 。我正在寻找的是一些C#代码, 将基于开始日期和 结束日期计算“每隔一周”的日期。日历重复在不同的频率

例如:如果用户输入的日期为2012年7月7日的事件,并希望它 每隔一周重复,直到2012年7月31日,该代码将返回 日期如下:

2012年7月7日 2012年7月14日 2012年7月21日 2012年7月28日

和一个更多的功能是有在工作日的选择(即,周一,周二,周三..)。

任何帮助将不胜感激。

+0

你试过了什么?什么错误? – Sascha 2012-07-07 06:08:57

回答

0

你可能需要一个功能,它有两个datetime对象(开始日期和结束日期),并在事件之间的一些间隔。然后可以使用DateTime.AddDays(double value)函数来生成所有的中间日期。为了得到每隔一周,你的间隔将是14.你将继续增加14天,直到你得到的日期是在结束日期之后。

//Create a list of DateTimes including the start date, with the specified 
//number of days in between each item in the list. 
public static IList<DateTime> GetRepeatingEvents(DateTime start, DateTime end, int intervalInDays) 
{ 
    List<DateTime> allEvents = new List<DateTime>(); 
    allEvents.Add(start); //Make sure the start date is included in the list of dates! 

    var tempDate = start; 
    while (tempDate <= end) //Less than or Equals means the end date will be added as well 
    { 
    tempDate = tempDate.AddDays(intervalInDays); 
    allEvents.Add(tempDate); 
    } 
    return allEvents; 
} 

你需要小心一点,如果你的开始和结束日期包含时间成分为好。例如,如果:

  • 你的起始日期为2012年7月7日10:30
  • 的结束日期是2012年7月28日,9:00 AM
  • 您的间隔时间就一个星期(7天)

然后上述功能将不包括在列表中的7月28日的日期,因为后21天7月7日10:30 AM是7月28日10:30 AM这不会满足条件在while(tempDate <= end)因为端且发生rs at 9:00 AM

0
DateTime date = new Date(2005, 10, 03); 
List<DateTime> dates = new List<DateTime>(); 
do 
{ 
    var newDate = date.Add(7); 
    dates.Add(newDate); 
}While(newDate.Month == 10) 
-1

伪代码:

var startTime = new DateTime(2012, 7, 7); 
var stopTime = new DateTime(2012, 7, 31); 

do { 
    Console.WriteLine(startTime.ToShortDate()); 
    startTime.AddDays(7); 
} while (startTime < stopTime); 
0
if (DrpEvRepeats.SelectedValue == "Weekly") 
    { 
     int Weekly = Convert.ToInt32(DrpRptWeekly.SelectedValue); 
     TimeSpan WeeklyDifference = Convert.ToDateTime(txtWeeklyEnd.Text.Substring(6, 4) + "/" + txtWeeklyEnd.Text.Substring(3, 2) + "/" + txtWeeklyEnd.Text.Substring(0, 2) + " " + drpHHEnd.SelectedValue + ":" + drpMMEnd.SelectedValue) - Convert.ToDateTime(txtStartDate.Text.Substring(6, 4) + "/" + txtStartDate.Text.Substring(3, 2) + "/" + txtStartDate.Text.Substring(0, 2) + " " + drpHHStart.SelectedValue + ":" + drpMMStart.SelectedValue); 
     foreach (RepeaterItem rpI in rptEvRepeat.Items) 
     { 
      for (int i = 0; i <= Convert.ToInt32((Convert.ToInt32(WeeklyDifference.TotalDays))/7); i += Weekly) 
      { 
       DataRow objDR = dtEvRepeat.NewRow(); 
       objDR["SrNo"] = ""; 

       //string rptOn = ""; 
       //for (int j = 0; j < chkRptOn.Items.Count; j++) 
       //{ 
       // if (chkRptOn.Items[j].Selected) 
       //  rptOn += chkRptOn.Items[j].Value + ","; 
       //} 
       //rptOn = rptOn.TrimEnd(','); 

       if (txtStartDate.Text != "") 
        objDR["StartDate"] = Convert.ToDateTime(txtStartDate.Text.Substring(6, 4) + "/" + txtStartDate.Text.Substring(3, 2) + "/" + txtStartDate.Text.Substring(0, 2) + " " + drpHHStart.SelectedValue + ":" + drpMMStart.SelectedValue).AddDays(i * 7); 
       else 
        objDR["StartDate"] = ""; 

       if (txtEndDate.Text != "") 
        objDR["EndDate"] = Convert.ToDateTime(txtEndDate.Text.Substring(6, 4) + "/" + txtEndDate.Text.Substring(3, 2) + "/" + txtEndDate.Text.Substring(0, 2) + " " + drpHHEnd.SelectedValue + ":" + drpMMEnd.SelectedValue).AddDays(i * 7); 
       else 
        objDR["EndDate"] = ""; 

       dtEvRepeat.Rows.Add(objDR); 
      } 
     } 
    } 
+0

我已经试过了这样的模式 – 2012-07-07 06:55:18

+1

你会非常小心如何将字符串转换为DateTime对象。你现在在做什么取决于字符串是否处于特定格式,并且只能在世界某些地区使用。例如,有些地方使用MM/DD/YYYY,其他地方使用DD/MM/YYYY,上述代码将失败一半。考虑使用[其中之一](http://msdn.microsoft.com/zh-cn/library/system.datetime.datetime)DateTime构造函数而不是'Convert.ToDateTime' – 2012-07-08 01:04:22