2016-08-10 7 views
2

주어진 달 수만큼 날짜를 이동하려고하고 있지만 같은 날을 유지하려고합니다 (예 : 날짜가 월요일 일 경우와 함께 이동 한 후 x 개월이 목요일이면 새 획득 날짜에서 3 일을 뺍니다.이 알고리즘은 새로 획득 한 날짜에 따라 요일을 더하거나 뺍니다 (기본적으로 같은 요일을 나타내는 가장 가까운 날짜를 제공). 예를 들어, 시작일이 10.08.2016 (수요일)이고 3 개월을 추가하면 10.11.2016 (목요일)이 될 것이므로 그날 가장 가까운 수요일은 09.11.2016입니다. 나는까지 만들어 관리 어떤개월 단위로 날짜 이동하지만 같은 날로 유지하십시오.

지금과 같은 : startDay를가 시작 날짜를, 그리고 기간은 내가으로 이동 할 개월 수입니다

int startDayOfWeek = ((int)startDay.DayOfWeek) == 0 ? 7 : (int)startDay.DayOfWeek; 
int newStartDayOfWeek = ((int)startDay.AddMonths(period).DayOfWeek) == 0 ? 7 : (int)startDay.AddMonths(period).DayOfWeek; 
int shiftingDays = startDayOfWeek - newStartDayOfWeek; 

if (shiftingDays > 3) 
    shiftingDays -= 7; 

.

하지만 여전히 몇 번 실패하므로 팁을 주시면 감사하겠습니다.

이 코드가 될 것이다 실패 예 : 의 startDate = 2016년 1월 8일 (월)과 기간은 5 개월 추가 한 후 5 될 것이라고, 나는 일요일 2017년 1월 1일를 얻고, 가장 가까운 월요일에있을 것입니다 02.01.2017,하지만 6 일이 걸립니다.

+1

어떤 상황에서 실패합니까? – ChrisF

+0

사용 : 새 DateTime (startDayOfWeek.Year, startDayOfWeek.month + 1, startDayOfWeek.day). – jdweng

+0

예를 들어, 1 월 31 일을 1 개월 단위로 이동할 때 어떻게해야합니까? – CompuChip

답변

2

이 코드를 사용하십시오. 아이디어를 7로 나누고 반올림 한 다음 7을 곱합니다.

DateTime endDate = startDay.AddMonths((int)period); 
endDate = startDay.AddDays((int)Math.Round((double)(endDate - startDay).Days/7)*7); 
+1

정수를 나눌 때 반올림이 수행됩니다 :'int result = 5/2; // 2'와'int result = 3/2; // 1' – fubo

+0

아니요, 부분 자름 소수 부분, 반올림되지 않음 – Angel

0

찾고 계신가요?

static void Main(string[] args) 
{ 
    //DateTime startDay = DateTime.Now; 
    DateTime startDay = new DateTime(2016, 8, 1); 
    //DateTime startDay = new DateTime(2016, 8, 10); 

    DateTime newDay = startDay.AddMonths(5); 

    int startDayOfWeek = (int)startDay.DayOfWeek; 
    int newDayOfWeek = (int)newDay.DayOfWeek; 

    int shift1 = (7 + startDayOfWeek - newDayOfWeek) % 7; 
    int shift2 = (7 + newDayOfWeek - startDayOfWeek) % 7; 

    DateTime test = newDay + ((shift1 > shift2) ? - TimeSpan.FromDays(shift2) : TimeSpan.FromDays(shift1)); 
} 
관련 문제