2012-07-07 5 views
3

사용자가 이벤트를 추가하고 이 다양한 주파수 (즉, 매일, 주간, 월별, 토요일/일요일 등)에서 반복되는지 여부를 구성 할 수있는 ASP.Net 일정 기능이 있습니다. . 내가 찾고있는 건 의 시작일과 " "의 종료일을 기준으로 "Every Week Week"의 날짜를 계산하는 C# 코드입니다.다양한 주파수에서 캘린더 반복

예 : 2012 년 7 월 7 일

: 사용자가 7 월 7 일 2012 년 이벤트를 입력 7 월 (31), 2012 년까지 격주를 반복 그것을 을하고자하는 경우 코드는 다음 날짜를 반환합니다 2012년 7월 14일 2012년 7월 21일 년 7 월 28 일

2012 년 또 하나의 기능이 주에 일의 선택에있다 (즉, 월, 화, 수 ...).

도움을 주시면 감사하겠습니다.

+0

당신은 무엇을 시도 했습니까? 어떤 오류입니까? – Sascha

답변

0

. 그런 다음 DateTime.AddDays(double value) 함수를 사용하여 모든 중간 날짜를 생성 할 수 있습니다. 2 주 간격으로 간 격을 얻으려면 간격은 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시 반
  • 종료일 2012년 7월 28일 오전 9시
  • 했다 귀하의 간격이 있었다 일주 (7 일)

이어서 이십일일 7 월 7 이후 오전 10시 반이 while(tempDate <= end) 때문에 결국 조건을 만족하지 않을 오전 10시 반 7 월 28이므로 목록 7 월 28 일자를 포함하지 않을 함수 위 occu 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

나는 이런 식으로 시험해 보았습니다 –

+1

문자열을 DateTime 객체로 변환하는 방법에 대해 매우 신중해야합니다. 지금하고있는 일은 문자열이 특정 형식으로되어 있고 전 세계의 특정 지역에서만 작동합니다. 예를 들어, 어떤 곳은 MM/DD/YYYY를 사용하고 다른 장소는 DD/MM/YYYY를 사용합니다. 위의 코드는 절반으로 실패합니다. [다음 중 하나를 사용하는 것이 좋습니다 (http://msdn.microsoft.com/en-us/library/system.datetime.datetime) DateTime 생성자 대신 'Convert.ToDateTime' –

관련 문제