HOWTO: Calculating Years, Months, and Days Between Two Dates

Last reviewed: March 20, 1998
Article ID: Q130444
2.50 2.50a 2.50b 2.60 2.60a 3.00| 2.50 2.50a 2.50b 2.60 2.60a
WINDOWS                         | MS-DOS
kbprg kbcode

The information in this article applies to:

  • Microsoft Visual FoxPro for Windows, version 3.0
  • Microsoft FoxPro for Windows, versions 2.5, 2.5a, 2.5b, 2.6, 2.6a
  • Microsoft FoxPro for MS-DOS, versions 2.5, 2.5a, 2.5b, 2.6, 2.6a

SUMMARY

The program in this article shows by example how to calculate the combination of days, months, and years between two dates (starting date and ending date) passed as date parameters.

NOTE: The starting date must be an earlier date than the ending date.

MORE INFORMATION

To run the program, save the following code as BTWNDATE.PRG. Then issue the following command where startdate and enddate are date values:

   DO BTWNDATE.PRG WITH startdate, enddate

For example:

   DO BTWNDATE WITH {01/05/93},{01/05/95}

Code Sample

   *
   * BTWNDATE.PRG
   *

   PARAMETERS startdate, enddate
   IF startdate > enddate
        WAIT WINDOW "Start date must " + CHR(13) ;
        + "be earlier than End date"
        RETURN
   ENDIF
   IF PARAMETERS() <> 2
        WAIT WINDOW "Not Correct Number of Parameters"
        RETURN
   ENDIF

   PRIVATE  precmpdate, vyears, vmonths, vdays
   precmpdate={}
   vyears=0
   vmonths=0
   vdays=0
   * Calculate:
   *     endofmonth is the last day of month prior to month of enddate
   *
   endofmonth = CTOD(ALLTRIM(STR(MONTH(enddate))) + '/' + "01" + '/' + ;
   ALLTRIM(STR(YEAR(enddate)))) - 1
   *
   IF MONTH(startdate) <= MONTH(enddate)
        vyears = YEAR(enddate) - YEAR(startdate)
        IF DAY(startdate) <= DAY(enddate)
             vmonths = MONTH(enddate) - MONTH(startdate)
             vdays = DAY(enddate) - DAY(startdate)
        ELSE
             IF MONTH(startdate) = MONTH(enddate)
                  vyears = vyears - 1
             ENDIF
             vmonths = MOD(MONTH(enddate) - MONTH(startdate) - 1 + 12, 12)
             vdays = endofmonth - precmpdate + DAY(enddate)
        ENDIF
   ELSE
        vyears = YEAR(enddate) - YEAR(startdate) - 1
        IF DAY(startdate) > DAY(enddate)
             vmonths = MONTH(enddate) - MONTH(startdate) + 12 - 1
             vdays = endofmonth - precmpdate + DAY(enddate)
        ELSE
             vmonths = MONTH(enddate) - MONTH(startdate) + 12
             vdays = DAY(enddate) - DAY(startdate)
        ENDIF
   ENDIF
   CLEAR
   WAIT WINDOW  CHR(13) + ;
             '  Years: '  + STR(vyears) + CHR(13) + ;
             ' Months: ' + STR(vmonths) + CHR(13) + ;
             '   Days: ' + STR(vdays) + CHR(13) + ;
             CHR(13) + ;
             ' Between ' + DTOC(startdate) + CHR(13) +;
             '     and ' + DTOC(enddate)

   RETURN

convert date

	
	


KBCategory: kbprg kbcode kbhowto
KBSubcategory: FxprgGeneral VFoxWin FoxWin FoxDos
Additional reference words: 3.00 2.50 2.50a 2.50b 2.60 2.60a
Keywords : FoxDos FoxWin FxprgGeneral vfoxwin kbcode kbhowto kbprg
Version : 2.50 2.50a 2.50b 2.60 2.60a 3.00
Platform : MS-DOS WINDOWS


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: March 20, 1998
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.