Y2K Date Routines

 

Thirteen programs provide just about any date conversion function that could possibly be required:

Y2KATOG Converts astronomical number to Gregorian format.
Y2KCONV Uses a conversion point to convert a 2 digit year to a 4 digit year.
Y2KDFMT Formats a Gregorian date into a variety of formats.
Y2KDOWN Returns day of week number for Gregorian date.
Y2KESTR Returns Gregorian date of Easter for any given year.
Y2KGETD Returns current date in Gregorian, Julian and astrological number formats.
Y2KGTOA Converts Gregorian format date to astronomical number.
Y2KGTOJ Converts Gregorian format date to Julian format.
Y2KJTOG Converts Julian format date to Gregorian format.
Y2KLAGE Computes number of years, months, days between two Gregorian format dates.
Y2KLEAP Determines if passed year is a leap year
Y2KPROJ Returns Gregorian format date using specified Gregorian format date plus/minus offset.
Y2KSAGE Computes number of days between two Gregorian format dates.
Y2KTDOW Returns next/previous specified day of week from Gregorian format date.

Using the intrinsic functions of GnuCOBOL, some of these routines are now redundant, but at the time I wrote them, they all provided very useful functionality.

There is also an installation verification program provided, Y2KIVP, along with a set of test data to verify that the expected results are obtained from the execution of the program.

To install all fifteen source programs and the test data file, and compile the programs, execute the bash script: Y2K.setup [md5: f8ee497a5275b6695194fb88635834cf].  Right click on the link and save the script in the location where you want the source programs to reside, then execute it.  It will create files containing the fifteen source programs, plus the one data file, then execute the GnuCOBOL compiler to compile the fifteen programs.  The GnuCOBOL compiler must be installed prior to executing the bash script.

To verify the programs are functioning correctly, the setup script will execute the program Y2KIVP, which will read the data file Y2KIVP.dat and produce a report into the file Y2KIVP.rpt.  The report will include expected and actual results for a variety of test dates:

DATE: 05/15/2016                              YEAR 2000 COMPLIANT DATE SUBROUTINES                                   PROGRAM: Y2KIVP
TIME: 17:30                                    INSTALLATION VERIFICATION PROGRAM                                        PAGE:      1

TEST DATA INPUT RECORD                                       ROUTINE  R/C
ATOG 2$%D000           INVALID CHARACTERS (ZD)               Y2KATOG  *2*  INVALID ZONED-DECIMAL DATA
ATOG 2304000           INVALID VALUE (RANGE)                 Y2KATOG  *4*  INVALID VALUE (OUT OF RANGE)
ATOG 2305813           INVALID VALUE (RANGE)                 Y2KATOG  *4*  INVALID VALUE (OUT OF RANGE)
ATOG 2305814           01/01/1601                            Y2KATOG   0   01/01/1601
ATOG 2962884           12/31/3399                            Y2KATOG   0   12/31/3399
ATOG 2962885           INVALID VALUE (RANGE)                 Y2KATOG  *4*  INVALID VALUE (OUT OF RANGE)
ATOG 2980000           INVALID VALUE (RANGE)                 Y2KATOG  *4*  INVALID VALUE (OUT OF RANGE)
ATOG 2451544           12/31/1999                            Y2KATOG   0   12/31/1999
ATOG 2451545           01/01/2000                            Y2KATOG   0   01/01/2000
ATOG 2451546           01/02/2000                            Y2KATOG   0   01/02/2000
ATOG 2451547           01/03/2000                            Y2KATOG   0   01/03/2000
CONV 010197 1 70       01/01/1997  1997/001  2,450,450       Y2KCONV   0   01/01/1997  1997/001  2,450,450
CONV 310197 2 70       01/31/1997  1997/031  2,450,480       Y2KCONV   0   01/31/1997  1997/031  2,450,480
CONV 970103 3 70       01/03/1997  1997/003  2,450,452       Y2KCONV   0   01/03/1997  1997/003  2,450,452
CONV 97004  4 70       01/04/1997  1997/004  2,450,453       Y2KCONV   0   01/04/1997  1997/004  2,450,453
CONV 060195 1 97       06/01/2095  2095/152  2,486,395       Y2KCONV   0   06/01/2095  2095/152  2,486,395
CONV 01A597 1 70       INVALID CHARACTERS (ZD)(DATE)         Y2KCONV  *2*  INVALID ZONED-DECIMAL DATA (DATE)
CONV 010197 8 70       INVALID VALUE (FORMAT)                Y2KCONV  *5*  INVALID DATE FORMAT CODE
CONV 010197 1 B7       INVALID CHARACTERS (ZD)(BREAK)        Y2KCONV  *3*  INVALID ZONED-DECIMAL DATA (BREAK)
CONV 130197 1 70       INVALID VALUE (MONTH)                 Y2KCONV  *6*  INVALID VALUE (MONTH)
CONV 023197 1 70       INVALID VALUE (DAY)                   Y2KCONV  *8*  INVALID VALUE (DAY)
CONV 131397 2 70       INVALID VALUE (MONTH)                 Y2KCONV  *6*  INVALID VALUE (MONTH)
CONV 300297 2 70       INVALID VALUE (DAY)                   Y2KCONV  *8*  INVALID VALUE (DAY)

... report continues for six pages

Since these routines are intended to be called by other programs to provide the date conversion functionality, you should move the object modules (ending with .so extension) to the location specified for your COB_LIBRARY_PATH. 

To facility building your own COBOL programs using the library of routines, a Y2K.cpy member is also created in the installation directory and should be copied to the location pointed to by your COB_COPY_DIR variable.

Update 18 September 2017: The 2.2 release of GnuCOBOL had a bug that reared its head when the INITIAL operand was included on PROGRAM-ID. The bug will be fixed, but the use of INITIAL was probably a poor choice by me and I decided to remove the INITIAL operand and instead utilize LOCAL-STORAGE for fields that were in WORKING-STORAGE for all the subprograms. I did leave constant fields in the WORKING-STORAGE section in the few programs where there were constant fields defined/used. I also modified the day and month names in the constant tables of Y2KDFMT from UPPER to Mixed case. The environment in which these routines were developed was an IBM Mainframe, where UPPER case was the expected norm. In any modern environment, Mixed case will be expected, so this is a logical change to make at this time, as I am already making the other change. Functionally, the only change that will be evident is the case of the day and month names returned from Y2KDFMT.

Update 24 August 2024: While discussing with my son how to determine leap year, I realized I had not converted the original 370 assembler version of Y2KLEAP to COBOL, so I made that conversion and altered the two programs which had inline code to determine leap year to call Y2KLEAP.


This page was last updated on August 24, 2024.