3

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

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

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

还有一项功能可以选择一周中的日子(即星期一、星期二、星期三……)。

任何帮助将不胜感激。

4

4 回答 4

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)
于 2012-07-07T06:11:19.523 回答
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
  • 您的间隔是一周(7 天)

那么上面的函数不会在列表中包含 7 月 28 日的日期,因为 7 月 7 日上午 10:30 之后的 21 天是 7 月 28 日上午 10:30,这不满足条件,while(tempDate <= end)因为结束发生在上午 9:00

于 2012-07-07T06:13:56.863 回答
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);
            }
        }
    }
于 2012-07-07T06:54:57.497 回答
-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 );
于 2012-07-07T06:12:17.580 回答