ZZUtils - ZZMONTH


ZZMONTH is a subprogram to compute dates which are a specified number of months from a given date.

ZZMONTH has five parameters.  Two are passed to ZZMONTH: a starting date and a number of months.  The number of months has a format of N4 and may be positive or negative.  Three parameters are returned from ZZMONTH: an exact date and a date range.

The source code for ZZMONTH follows, as does sample source for a calling routine.  Two sample screen images also are included.

ZZMONTH is in the source module section of ZZUtils, a collection of Natural utilities.  Look for more information in my Natural Tips & Techniques section - Tip 8.



Sample on-line mainline

* Given a date, determine a new date some number of months into the
* future (+ months) or past (- months).
*
DEFINE DATA LOCAL
1 #GIVEN(D)        INIT<*DATX>
1 #MONTHS(N4)
1 #EXACT(D)
1 #FROM(D)
1 #THRU(D)
END-DEFINE
*
SET KEY PF3 PF15
SET CONTROL 'Q'
REPEAT
  INPUT(AD=O IP=F)
            *PROGRAM
        10T 'Natural Utilities'(I)
        66T *DATX
            *TIME(AL=5)
      / 10T 'Month Calculations'
    /// 15T ' Given date:' #GIVEN(AD=MDLT'_' EM=YYYY-MM-DD)
     // 15T 'Months(+/-):' #MONTHS(AD=MDLT'_')
   //// 15T '   New date:' #EXACT(EM=YYYY-MM-DD)
    /// 15T '       From:' #FROM (EM=YYYY-MM-DD)
     // 15T '       Thru:' #THRU (EM=YYYY-MM-DD)
  ///// 10T 'PF3'(I) 'Exit'
  IF  *PF-KEY = 'PF3'
           OR = 'PF15'
    THEN
      STOP
  END-IF
*
  CALLNAT 'ZZNMONTH' #GIVEN
                     #MONTHS
                     #EXACT
                     #FROM
                     #THRU
END-REPEAT
END
 



ZZMONTH monthly date calculation

DEFINE DATA
PARAMETER
1 #GIVEN(D)
1 #MONTHS(N4)
1 #EXACT(D)
1 #FROM(D)
1 #THRU(D)
LOCAL
1 #G(A8)      1 REDEFINE #G
  2 #G-DD(N2)
1 #TEMP(D)    1 REDEFINE #TEMP
  2 #T-P(P7)
1 #T(A8)      1 REDEFINE #T
  2 #T-DD(N2)
1 #I(P4)
END-DEFINE
*
MOVE EDITED #GIVEN(EM=DDMMYYYY) TO #G
ASSIGN #EXACT = #GIVEN
ASSIGN #T     = #G
ASSIGN #T-DD  = 1                      /* Start of the month
MOVE EDITED #T TO #TEMP(EM=DDMMYYYY)
DECIDE FOR FIRST CONDITION             /* Determine the month
  WHEN #MONTHS < 0
       FOR #I = #MONTHS -1
         SUBTRACT 1 FROM #TEMP         /* End of the prior month
         MOVE EDITED #TEMP(EM=DDMMYYYY) TO #T
         ASSIGN #THRU = #TEMP
         ASSIGN #T-DD = 1              /* Start of the prior month
         MOVE EDITED #T TO #TEMP(EM=DDMMYYYY)
         ASSIGN #FROM = #TEMP
       END-FOR
  WHEN #MONTHS > 0
       FOR #I = 0 #MONTHS
         ASSIGN #FROM = #TEMP
         ASSIGN #T-DD = 28             /* Even February has this many
         REPEAT UNTIL #T-DD = 1        /* 'Search' for next month
           MOVE EDITED #T TO #TEMP(EM=DDMMYYYY)
           ADD 1 TO #TEMP
           MOVE EDITED #TEMP(EM=DDMMYYYY) TO #T
         END-REPEAT
       END-FOR
       ASSIGN #THRU = #TEMP - 1
  WHEN ANY
       ASSIGN #TEMP = #THRU
       MOVE EDITED #TEMP(EM=DDMMYYYY) TO #T
       REPEAT UNTIL #T-DD = #G-DD
         IF  #T-DD <= #G-DD
           THEN
             ESCAPE BOTTOM
         END-IF
         SUBTRACT 1 FROM #TEMP
         MOVE EDITED #TEMP(EM=DDMMYYYY) TO #T
       END-REPEAT
       ASSIGN #EXACT = #TEMP
  WHEN NONE
       MOVE EDITED #GIVEN(EM=DDMMYYYY) TO #T
       ASSIGN #T-DD = 1                /* Start of the month
       MOVE EDITED #T TO #FROM(EM=DDMMYYYY)
       ASSIGN #T-DD = 28               /* Even February has this many
       REPEAT UNTIL #T-DD = 1          /* 'Search' for next month
         MOVE EDITED #T TO #THRU(EM=DDMMYYYY)
         ADD 1 TO #THRU
         MOVE EDITED #THRU(EM=DDMMYYYY) TO #T
       END-REPEAT
       SUBTRACT 1 FROM #THRU           /* Last day of given month
END-DECIDE
END



Sample Screen Images:
 
 ZZMONTH  Natural Utilities                                       98-02-28 15:43 
          Month Calculations 
 

                Given date: 1998-02-28 

               Months(+/-): 0____ 
 
 

                  New date: 1998-02-28 
 

                      From: 1998-02-01 

                      Thru: 1998-02-28 
 
 
 

          PF3 Exit 
 

 
  ZZMONTH  Natural Utilities                                       98-02-28 15:44 
          Month Calculations 
 

                Given date: 1999-12-18 

               Months(+/-): 2____ 
 
 

                  New date: 2000-02-18 
 

                      From: 2000-02-01 

                      Thru: 2000-02-29 
 
 
 

          PF3 Exit 
 



Return to top.

Return to Ralph G. Zbrog's home page.

Last updated April 25, 1998, by Ralph G. Zbrog.