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