2010-01-30 2 views
2

이것은 숙제 문제가 아닙니다 :).VB6에서 주어진 날짜로부터 6 개월이 지난 후에 계산하는 방법은 무엇입니까?

주어진 날짜 이후 6 개월이 지나면 True를 반환하는 함수를 코딩하고 싶습니다. (따라서, 나는 7 번째 달의 첫날입니다).

기능 PassedSixMonthsSince (날짜와 같은 희미한 dGivenDate, 날짜 등의 희미한 dCurrentDate) 부울로

다음은 몇 가지 검사는이 기능을 통과해야 다음과 같습니다

Debug.Assert PassedSixMonthsSince ("2000 -01-01 ","2000-07-01 ") = True

Debug.Assert PassedSixMonthsSince ("2000-01-31 ","2000-07-31 ") = True

Debug.Assert PassedSixMonthsSince는 ("2000년 8월 31일가", "2001년 2월 28일")가 거짓

Debug.Assert PassedSixMonthsSince을 = ("2007-08-31", "2008-02-29") = 거짓

Debug.Assert PassedSixMonthsSince는 ("2000년 5월 31일는", "2000-11-30")는 6 내가 DateAdd 함수 ("m"을 사용하려고 한

dGivenDate = 거짓)하지만 그렇게 쉬운 일은 아닙니다.

감사 미셸

답변

0

이 코드로 해결 한 :.

Function PassedSixMonthsSince(ByVal dGivenDate as Date,ByVal dCurrentDate as Date) 
    dGivenDateWithSixMonthsAdded=DateAdd("m", 6, dGivenDate) 
    if Day(dGivenDate)<>Day(dGivenDateWithSixMonthsAdded) then 
      dGivenDateWithSixMonthsAdded=DateAdd("d", 1,dGivenDateWithSixMonthsAdded) 
    end if 
    PassedSixMonthsSince = (dCurrentDate >= dGivenDateWithSixMonthsAdded) 
End Function 
1

나는 VB6 더 이상 설치하지 않은,하지만 난이 VBScript 코드를 시도 : 내가 대시와 맞 "2001-02-29" 잘못된 날짜를 사용하도록 날짜 구분 기호를 대체

<script language="vbscript"> 

Function PassedSixMonthsSince(dGivenDate, dCurrentDate) 

    '' // should be just greater, not greater or equals 
    PassedSixMonthsSince = _ 
     CDate(dCurrentDate) >= DateAdd("m", 6, CDate(dGivenDate)) 
    MsgBox _ 
     "Is " & CDate(dCurrentDate) & _ 
     " greater or equal than " & DateAdd("m", 6, CDate(dGivenDate)) & _ 
     " ? = " & PassedSixMonthsSince 

End Function 

PassedSixMonthsSince "2000-01-01", "2000-07-01" ''// exactly 6 months 
PassedSixMonthsSince "2000-01-31", "2000-07-31" ''// exactly 6 months 
PassedSixMonthsSince "2000-08-31", "2001-02-28" ''// One day less 6 months 
PassedSixMonthsSince "2000-05-31", "2001-11-30" ''// One day less 6 months 

</script> 

. 그러나 당신의 주장은 틀린 것입니다.

+0

는 "2001년 2월 29일는 정확한 날짜 매 4 년마다 적어도 –

+0

아니,하지만'2000-02-29'은 유효한 날짜입니다. –

+0

나는 내 주장을 고쳐 주었다. – systempuntoout

0

는 참조 DateDiff처럼 보인다는() 그 라인을 따라

IF DateDiff("m", FirstDate, SecondDate) >= 6 THEN 
return ture 
ELSE 
return false 
END IF 

뭔가 아마도

+2

그러나 월간 차이를 확인하는 데는 요일이 고려되지 않으므로 2010-01-31과 2010-02-01 사이에는 1 개월 차이가 있습니다. – Guffa

1

DataAdd 갈 올바른 방법입니다 ... VB6에서 사용할 수 있습니다.

PassedSixMonthsSince = DateAdd("m", 6, dGivenDate) >= dCurrentDate 

하거나 현재 날짜로부터 6 개월을 뺄 수 있습니다 : 당신은 주어진 날짜 6 개월을 추가 할 수 있습니다

PassedSixMonthsSince = dGivenDate >= DateAdd("m", -6, dCurrentDate) 

당신이 올바른 결과를 얻을 수없는 경우가 있기 때문이다 귀하가 작성한 날짜를 정확하게 파싱 할 수 없습니다. 당신이 사용한 형식은 (AFAIK) 당신 자신의 것입니다, 다른 사람이 사용하지 않은 것입니다. 표준화 된 형식 (ISO 8601)은 "2000-02-29"이고 "2/29/2000""29/2/2000"과 같은 다른 일반적인 형식이 있습니다. 문자열을 파싱하는 대신 날짜 리터럴을 사용하려는 경우 해시 기호로 구분됩니다 (#2000-02-29#).

+0

DateAdd가 작동하지 않습니다. 이것을보십시오 : DateAdd ("m", 6, "2000-05-31") .. 당신은 "2000-11-30"을 얻을 것이고 그것은 시험을 통과하지 못합니다. 2000-11-30 년 5 개월 30 일이지나 갔지만 요청한 날짜는 6 개월이 아닙니다. DateAdd를 사용하여 6 개월을 추가하면 마지막 세 번의 테스트에서 False를 반환해야합니다. – systempuntoout

+0

@systempuntoout : 다른 테스트를 추가했습니다. 2000-11-30에서 -6 monhts를 추가하면 2000-05-30이되며 2000-05-31보다 작습니다. 따라서 모서리의 경우를 잡으려면 더하기와 빼기를 모두 테스트해야합니다. – Guffa

관련 문제