2010-03-29 2 views
2

나는 일주일에 1 주일 안에 함수를 만들었고 그 함수가 잘 작동합니다. 문제는 내가 주중 월요일을 잡을 수있는 방법이 필요하다는 것입니다. 이것은 스웨덴의 달력입니다.53 주년으로 일하는 주에서 날짜를 얻으려면 어떻게해야합니까? C#

아래 코드는 52 주 동안 잘 작동하지만 몇 년 (2009 년 등)에는 53 주가 있습니다. 그 다음 나는 januari에서 mondaydate (권리가없는 것)로서 날짜를 얻었다. 그래서 제게 일 년 동안 일하도록 도와주세요.

아마도 내가 할 수있는 것은 올해에 53 주를 확인한 다음 몇 가지 수표를 확인하는 것입니다.하지만 수표를 사용하지 않고 원활하게 진행하고 싶습니다.

public static DateTime GetDateFromWeek(int year, int week) 
    { 
     //First day of the year 
     DateTime d = new DateTime(year, 1, 1); 
     GregorianCalendar calendar = new GregorianCalendar(GregorianCalendarTypes.MiddleEastFrench); 
     d = calendar.AddWeeks(d, week); 
     d = d.AddDays(1 - (double)d.DayOfWeek); 
     return d; 
    } 
+0

문제 2009 년 53 주 가지고 있다는 것입니다! –

+0

내 대답을 확인하십시오. –

+0

모든 답변을 잠시 후에 확인해 보겠습니다. :) –

답변

4

귀하의 기본 문제는 DateTime d = new DateTime(year, 1, 1);이 올해의 첫 주에 있지만 전년도의 52/53 주에 속할 수 있다는 가정이라고 생각합니다.

해결 방법은 here입니다.

+0

감사합니다. 나도 내가 뭘 잘못하고 있었는지 나에게 지적 해 주었다.) –

+0

BTW 코드에 대한 몇 가지 지침이있다. Debug.Assert (> = 1)를 사용하고 예외를 throw하지 않는 이유는 무엇입니까? 제 의견으로는 인수 예외에 대한 좋은 장소가 될 것입니다. –

+0

@Oskar : Assert는 예외를 throw합니다. 하지만 당신은 맞습니다. 생산 코드에서 '정상적인'예외를 던질 것입니다. –

0

당신은 다음과 같은 질문을 살펴 가지고 할 수 있습니다, 나는 당신이 요구하는 어떤 생각 : 내가 가지고 올 한 내용을 여기에

입니다

Get date of first Monday of the week?

2

이 그것을 수행해야합니다

public static DateTime GetDateFromWeek(int year, int week) 
{ 
    GregorianCalendar calendar = new GregorianCalendar(GregorianCalendarTypes.MiddleEastFrench); 
    DateTime d = new DateTime(year, 12, 31); 
    int weeksInYear = calendar.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    int weeksToSubtract = weeksInYear - week; 
    d = calendar.AddWeeks(d, -weeksToSubtract); 
    d = d.AddDays(1 - (int)d.DayOfWeek); 
    return d; 
} 
+0

이것은 잘 작동하지만 Henk Holterman의 솔루션이 좀 더 일반적이라는 것이 좋습니다. 해결책을 제공하기 위해 +1 토스트 –

+0

두 솔루션은 처음부터가 아니라 연말에 시작한 것 외에는 거의 같습니다. 다행 이군. –

+0

네, 몇 가지 단위 테스트를했고 그것들을 돌려주었습니다. 그는 너보다 조금 더 빨랐다.) –

-1
if (cmb_mode_of_service.SelectedItem.ToString() == "Weekly Service") 
      { 
       int year = 0; 
       if (cmb_term_of_service.SelectedItem.ToString() == "One Year") 
       { 
        year = 1; 
       } 

       if (cmb_term_of_service.SelectedItem.ToString() == "Two Year") 
       { 
        year = 2; 
       } 

       if (cmb_term_of_service.SelectedItem.ToString() == "three year") 
       { 
        year = 3; 
       } 

       DateTime currentdate = Convert.ToDateTime(service_start_date.Text); 
       DateTime Enddate = currentdate.AddYears(+year); 


       char c1 = 'A'; 
       int c2 = 1; 
       for (var dt1 = currentdate; dt1 <= Enddate; dt1 = dt1.AddDays(7)) 
       { 
        DataRow dr = dt.NewRow(); 
        dr["SN"] = c2++; 
        dr["serviceid"] = "S4-" + c1++; 
        dr["servicedate"] = dt1.ToString(); 
        dr["servicestatus"] = "Pending"; 
        dr["serviceexcutive"] = "Not Alowed"; 
        dt.Rows.Add(dr); 

       } 
       dataGridView1.DataSource = dt; 

      } 
+1

제공하는 솔루션에 대한 설명을 더 추가하여 답을 더 자세히 설명해 주시겠습니까? – abarisone

관련 문제