'===========================================================================
' Subject: HOW MANY DAYS                      Date: Year of 1993           
'  Author: Chris Tracy                        Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: DATETIME.ABC
'===========================================================================
DECLARE SUB Days (M1, D1, Y1, M2, D2, Y2, N)
 
Days 1, 1, 85, 1, 3, 93, Number
PRINT "The number of days between 1/1/85 and 1/1/93 is:"; Number
 
SUB Days (M1, D1, Y1, M2, D2, Y2, N)
' How Many Days v1.0 - By Chris Tracy
' Credit goes to the person who originally wrote this routine in GWBASIC...
' This routine can be used to find the number of days between ANY date.
' It accounts for leap years, leap centuries, etc.
 
' M1/D1/Y1 - The First Date (Ie. 1/1/85)
' M2/D2/Y2 - The Last Date (Ie. 1/3/93)
' N        - The Value Returned.
 
' See the main module of an example of how to use this routine.
CheckVariables:
        IF M1 > 12 THEN GOTO EndTheSub:
        IF D1 > 31 THEN GOTO EndTheSub:
MainBody:
        Y = Y1
        M = M1
        D = D1
        GOSUB FindDays:
        N = A
        Y = Y2
        D = D2
        M = M2
        GOSUB FindDays:
        N = A - N
        GOTO EndTheSub:
FindDays:
        ON M GOTO Check1, Check2, Check1, Check3, Check1, Check3, Check1, Check1, Check3, Check1, Check3, Check1
        RETURN
Check1:
        IF D > 31 THEN GOTO FindDays:
        GOTO DetermineDays:
Check2:
        IF Y / 4 <> INT(Y / 4) THEN GOTO Check4:
        IF Y / 400 = INT(Y / 400) THEN GOTO Check5:
        IF Y / 100 <> INT(Y / 100) THEN GOTO Check5:
Check4:
        IF D > 28 THEN GOTO Returner:
Check5:
        IF D > 29 THEN GOTO Returner:
        GOTO DetermineDays:
Check3:
        IF D > 30 THEN GOTO Returner:
DetermineDays:
    SELECT CASE M
        CASE 1
                A = 0
        CASE 2
                A = 31
        CASE 3
                A = 59
        CASE 4
                A = 90
        CASE 5
                A = 120
        CASE 6
                A = 151
        CASE 7
                A = 181
        CASE 8
                A = 212
        CASE 9
                A = 243
        CASE 10
                A = 273
        CASE 11
                A = 304
        CASE 12
                A = 334
    END SELECT
    A = A + Y * 365 + INT(Y / 4) + D + 1 - INT(Y / 100) + INT(Y / 400)
    IF INT(Y / 4) <> Y / 4 THEN GOTO Returner:
    IF Y / 400 = INT(Y / 400) THEN GOTO Returner:
    IF Y / 100 = INT(Y / 100) THEN GOTO Returner:
    IF M > 2 THEN GOTO Returner:
    A = A - 1
Returner:
    RETURN
EndTheSub:
    END SUB
