2012-07-07 70 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