Midrange News for the IBM i Community


Posted by: Bob Cozzi
Rogue Programmer
Cozzi Productions, Inc.
Chicagoland
RPGIII Get Day of Week Routine (Zeller Conguence)
has no ratings.
Published: 22 Dec 2011
Revised: 23 Jan 2013 - 2185 days ago
Last viewed on: 16 Jan 2019 (4880 views) 

Using IBM i? Need to create Excel, CSV, HTML, JSON, PDF, SPOOL reports? Learn more about the fastest and least expensive tool for the job: SQL iQuery.

RPGIII Get Day of Week Routine (Zeller Conguence) Published by: Bob Cozzi on 22 Dec 2011 view comments(2)

This is the RPGIII source code to calculate the day of the week, using Zeller's Congruence formula:

 

*****************************************************************
      **  Zeller's Congruence in RPGIII by Bob Cozzi, July 2006
      **   (c) 2006 by Bob Cozzi. All rights reserved.
      ***********************************************************
      **  Temp/work fields for calculation
     ITEMPS      IDS
     I                                    B   1   40DAYOWK
     I                                    B   5   80TEMP1
     I                                    B   9  120TEMP2
      **
      ** Put the date into this Data Structure
     IZDATE      IDS
     I                                        1   40NYEAR
     I                                        5   60NMONTH
     I                                        7   80NDAY
      ** Demo date is 23-July-1958 (should be a Wednesday)
     C                     Z-ADD1958      NYEAR
     C                     Z-ADD07        NMONTH
     C                     Z-ADD23        NDAY
     C                     EXSR ZDAY
     C                     MOVE *ON       *INLR
      ***********************************************************
      **  This subroutine calculates the day of the week using
      **  Zeller's congruence.
      **  --Converted to RPGIII by Bob Cozzi, July 2006
      **   (c) 2006 by Bob Cozzi. All rights reserved.
      **  Permission to use for any purpose is hereby granted
      **  provided credit to the copyright holder is included.
      **
      **  Input fields:
      **   zDate  Date in YYYYMMDD format
      **     nDay   Day of month
      **     nYear  Year
      **     nMonth Month
      ***********************************************************
     CSR         ZDAY      BEGSR
      **  If the month Jan or Feb, then adjust it to fit the algorythm.
      **  Also subtract 1 from the year in this situation.
     C           NMONTH    IFLT 3
     C                     ADD  12        NMONTH
     C                     SUB  1         NYEAR
     C                     ENDIF
      **
      **  Perform Zeller's formula to calculate the day of the week.
     C           NMONTH    MULT 13        TEMP1
     C                     ADD  3         TEMP1
     C                     DIV  5         TEMP1
     C                     ADD  NDAY      TEMP1
     C                     ADD  NYEAR     TEMP1
     C           NYEAR     DIV  4         TEMP2
     C                     ADD  TEMP2     TEMP1
      **
     C           NYEAR     DIV  100       TEMP2
     C                     SUB  TEMP2     TEMP1
     C           NYEAR     DIV  400       TEMP2
     C                     ADD  TEMP2     TEMP1
     C                     DIV  7         TEMP1
     C                     MVR            DAYOWK
      **
      **  At this point, we have the day of the week from Zeller.
      **  However, it is zero-based (Mon=0, Tues=1, Wed=3... etc.)
      **  This procedure is designed to return ones-based values
      **  as follows:  (Sun=1, Mon=2, Tues=3... etc.)
      **
      **  We need to convert the result from Zeller, as follows:
      **      If day is greater than 5, subtract 5 from the day.
      **      Otherwise, increase the day by 2.
      **      For example: Sun=6 so 6 - 5 = 1
      **                   Mon=0 so 0 + 2 = 2
      **                   Tue=1 so 1 + 2 = 3
      **                   Wed=2 so 2 + 2 = 4
      **                   Thu=3 so 3 + 2 = 5
      **                   Fri=4 so 4 + 2 = 6
      **                   Sat=5 so 5 + 2 = 7
      **
      **  If you prefer 0=Monday based return value, simply delete
      **  the code upto but NOT including the RETURN opcode.
     C           DAYOWK    IFGT 5
     C                     SUB  5         DAYOWK
     C                     ELSE
     C                     ADD  2         DAYOWK
     C                     ENDIF
     CSR         ENDZDY    ENDSR
 

 

Return to midrangenews.com home page.
Sort Ascend | Descend

COMMENTS