3

ASP.Netカレンダー機能があり、ユーザーはイベントを追加して、さまざまな頻度(つまり、毎日、毎週、毎月、土曜日/日曜日など)で繰り返すかどうかを構成できます。私が探しているのは、開始日と終了日に基づいて「隔週」の日付を計算するC#コードです。

例:ユーザーが2012年7月7日付けのイベントを入力し、2012年7月31日まで隔週で繰り返したい場合、コードは次の日付を返します。

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

そしてもう1つの機能は、週の曜日の選択にあります(つまり、月、火、水など)。

どんな助けでも大歓迎です。

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

おそらく、2つの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時でした
  • あなたの間隔は1週間(7日)でした

7月7日午前10時30分から21日後は7月28日午前10時30分であるため、上記の関数はリストに7月28日の日付を含めません。これは、while(tempDate <= end)終了が午前9時に発生するため、条件を満たしません。

于 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 に答える