The DAY function in COBOL retrieves the current date in Julian format (day of year), providing an alternative date representation useful for specific calculations and date processing scenarios.
1234567*> Basic DAY function usage ACCEPT WS-JULIAN-DATE FROM DAY *> YYDDD format ACCEPT WS-JULIAN-YYYYDDD FROM DAY YYYYDDD *> YYYYDDD format *> Example values: *> DAY: 23349 (December 15, 2023 = day 349 of year 2023) *> DAY YYYYDDD: 2023349
12345678910111213141516171819202122232425262728293031323334353637WORKING-STORAGE SECTION. 01 WS-JULIAN-DATE PIC 9(5). *> YYDDD 01 WS-JULIAN-YYYYDDD PIC 9(7). *> YYYYDDD 01 WS-STANDARD-DATE PIC 9(8). *> YYYYMMDD 01 WS-YEAR PIC 9(4). 01 WS-DAY-OF-YEAR PIC 9(3). 01 WS-FORMATTED-DATE PIC X(10). PROCEDURE DIVISION. PROCESS-JULIAN-DATES. *> Get current Julian date ACCEPT WS-JULIAN-YYYYDDD FROM DAY YYYYDDD *> Extract components MOVE WS-JULIAN-YYYYDDD(1:4) TO WS-YEAR MOVE WS-JULIAN-YYYYDDD(5:3) TO WS-DAY-OF-YEAR DISPLAY "Current Julian Date: " WS-JULIAN-YYYYDDD DISPLAY "Year: " WS-YEAR DISPLAY "Day of Year: " WS-DAY-OF-YEAR *> Convert Julian to standard date PERFORM CONVERT-JULIAN-TO-STANDARD DISPLAY "Standard Date: " WS-STANDARD-DATE. CONVERT-JULIAN-TO-STANDARD. *> Use COBOL intrinsic function for conversion COMPUTE WS-STANDARD-DATE = FUNCTION DATE-OF-INTEGER( FUNCTION INTEGER-OF-DAY(WS-JULIAN-YYYYDDD)) *> Format for display (MM/DD/YYYY) STRING WS-STANDARD-DATE(5:2) "/" WS-STANDARD-DATE(7:2) "/" WS-STANDARD-DATE(1:4) DELIMITED BY SIZE INTO WS-FORMATTED-DATE DISPLAY "Formatted Date: " WS-FORMATTED-DATE.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869WORKING-STORAGE SECTION. 01 WS-JULIAN-INPUT PIC 9(7) VALUE 2023349. 01 WS-YEAR PIC 9(4). 01 WS-DAY-OF-YEAR PIC 9(3). 01 WS-MONTH PIC 9(2). 01 WS-DAY PIC 9(2). 01 WS-DAYS-IN-MONTH PIC 9(2). 01 WS-LEAP-YEAR-FLAG PIC X. 01 WS-REMAINING-DAYS PIC 9(3). 01 WS-MONTH-DAYS. 05 FILLER PIC 9(2) VALUE 31. *> January 05 FILLER PIC 9(2) VALUE 28. *> February (adjusted for leap) 05 FILLER PIC 9(2) VALUE 31. *> March 05 FILLER PIC 9(2) VALUE 30. *> April 05 FILLER PIC 9(2) VALUE 31. *> May 05 FILLER PIC 9(2) VALUE 30. *> June 05 FILLER PIC 9(2) VALUE 31. *> July 05 FILLER PIC 9(2) VALUE 31. *> August 05 FILLER PIC 9(2) VALUE 30. *> September 05 FILLER PIC 9(2) VALUE 31. *> October 05 FILLER PIC 9(2) VALUE 30. *> November 05 FILLER PIC 9(2) VALUE 31. *> December 01 WS-DAYS-TABLE REDEFINES WS-MONTH-DAYS. 05 WS-DAYS-PER-MONTH PIC 9(2) OCCURS 12 TIMES. PROCEDURE DIVISION. MANUAL-JULIAN-CONVERSION. *> Extract year and day of year MOVE WS-JULIAN-INPUT(1:4) TO WS-YEAR MOVE WS-JULIAN-INPUT(5:3) TO WS-DAY-OF-YEAR *> Check for leap year PERFORM CHECK-LEAP-YEAR *> Adjust February for leap year IF WS-LEAP-YEAR-FLAG = 'Y' MOVE 29 TO WS-DAYS-PER-MONTH(2) ELSE MOVE 28 TO WS-DAYS-PER-MONTH(2) END-IF *> Find month and day MOVE WS-DAY-OF-YEAR TO WS-REMAINING-DAYS MOVE 1 TO WS-MONTH PERFORM UNTIL WS-REMAINING-DAYS <= WS-DAYS-PER-MONTH(WS-MONTH) SUBTRACT WS-DAYS-PER-MONTH(WS-MONTH) FROM WS-REMAINING-DAYS ADD 1 TO WS-MONTH END-PERFORM MOVE WS-REMAINING-DAYS TO WS-DAY DISPLAY "Julian Date: " WS-JULIAN-INPUT DISPLAY "Converted to: " WS-MONTH "/" WS-DAY "/" WS-YEAR. CHECK-LEAP-YEAR. MOVE 'N' TO WS-LEAP-YEAR-FLAG IF FUNCTION MOD(WS-YEAR, 4) = 0 IF FUNCTION MOD(WS-YEAR, 100) = 0 IF FUNCTION MOD(WS-YEAR, 400) = 0 MOVE 'Y' TO WS-LEAP-YEAR-FLAG END-IF ELSE MOVE 'Y' TO WS-LEAP-YEAR-FLAG END-IF END-IF.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849WORKING-STORAGE SECTION. 01 WS-STANDARD-DATE PIC 9(8) VALUE 20231215. 01 WS-JULIAN-RESULT PIC 9(7). 01 WS-YEAR PIC 9(4). 01 WS-MONTH PIC 9(2). 01 WS-DAY PIC 9(2). 01 WS-DAY-OF-YEAR PIC 9(3) VALUE ZERO. 01 WS-MONTH-COUNTER PIC 9(2). PROCEDURE DIVISION. CONVERT-STANDARD-TO-JULIAN. *> Extract date components MOVE WS-STANDARD-DATE(1:4) TO WS-YEAR MOVE WS-STANDARD-DATE(5:2) TO WS-MONTH MOVE WS-STANDARD-DATE(7:2) TO WS-DAY *> Using intrinsic function (recommended) COMPUTE WS-JULIAN-RESULT = FUNCTION DAY-OF-INTEGER( FUNCTION INTEGER-OF-DATE(WS-STANDARD-DATE)) DISPLAY "Standard Date: " WS-STANDARD-DATE DISPLAY "Julian Date (intrinsic): " WS-JULIAN-RESULT *> Manual calculation for demonstration PERFORM MANUAL-DAY-CALCULATION DISPLAY "Julian Date (manual): " WS-YEAR WS-DAY-OF-YEAR. MANUAL-DAY-CALCULATION. MOVE WS-DAY TO WS-DAY-OF-YEAR *> Add days from previous months PERFORM VARYING WS-MONTH-COUNTER FROM 1 BY 1 UNTIL WS-MONTH-COUNTER >= WS-MONTH EVALUATE WS-MONTH-COUNTER WHEN 1 OR 3 OR 5 OR 7 OR 8 OR 10 OR 12 ADD 31 TO WS-DAY-OF-YEAR WHEN 4 OR 6 OR 9 OR 11 ADD 30 TO WS-DAY-OF-YEAR WHEN 2 PERFORM CHECK-LEAP-YEAR IF WS-LEAP-YEAR-FLAG = 'Y' ADD 29 TO WS-DAY-OF-YEAR ELSE ADD 28 TO WS-DAY-OF-YEAR END-IF END-EVALUATE END-PERFORM.
1234567891011121314151617181920212223242526272829303132333435363738394041WORKING-STORAGE SECTION. 01 WS-JULIAN-START PIC 9(7) VALUE 2023100. *> April 10, 2023 01 WS-JULIAN-END PIC 9(7) VALUE 2023200. *> July 19, 2023 01 WS-DAYS-DIFFERENCE PIC 9(3). 01 WS-START-INTEGER PIC 9(7). 01 WS-END-INTEGER PIC 9(7). 01 WS-NEW-JULIAN PIC 9(7). 01 WS-DAYS-TO-ADD PIC 9(3) VALUE 45. PROCEDURE DIVISION. JULIAN-DATE-ARITHMETIC. *> Calculate difference between Julian dates COMPUTE WS-START-INTEGER = FUNCTION INTEGER-OF-DAY(WS-JULIAN-START) COMPUTE WS-END-INTEGER = FUNCTION INTEGER-OF-DAY(WS-JULIAN-END) COMPUTE WS-DAYS-DIFFERENCE = WS-END-INTEGER - WS-START-INTEGER DISPLAY "Start Julian: " WS-JULIAN-START DISPLAY "End Julian: " WS-JULIAN-END DISPLAY "Days difference: " WS-DAYS-DIFFERENCE *> Add days to a Julian date COMPUTE WS-NEW-JULIAN = FUNCTION DAY-OF-INTEGER( WS-START-INTEGER + WS-DAYS-TO-ADD) DISPLAY "Start + " WS-DAYS-TO-ADD " days = " WS-NEW-JULIAN *> Demonstrate year boundary crossing PERFORM YEAR-BOUNDARY-EXAMPLE. YEAR-BOUNDARY-EXAMPLE. 01 WS-YEAR-END-JULIAN PIC 9(7) VALUE 2023360. *> Dec 26, 2023 01 WS-DAYS-TO-ADD-YE PIC 9(2) VALUE 15. 01 WS-RESULT-JULIAN PIC 9(7). COMPUTE WS-RESULT-JULIAN = FUNCTION DAY-OF-INTEGER( FUNCTION INTEGER-OF-DAY(WS-YEAR-END-JULIAN) + WS-DAYS-TO-ADD-YE) DISPLAY "Year-end example:" DISPLAY "Start: " WS-YEAR-END-JULIAN " (Dec 26, 2023)" DISPLAY "Add " WS-DAYS-TO-ADD-YE " days" DISPLAY "Result: " WS-RESULT-JULIAN " (Jan 10, 2024)".
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253WORKING-STORAGE SECTION. 01 WS-CURRENT-JULIAN PIC 9(7). 01 WS-YEAR PIC 9(4). 01 WS-DAY-OF-YEAR PIC 9(3). 01 WS-DAYS-REMAINING PIC 9(3). 01 WS-PERCENT-COMPLETE PIC 9(3)V99. 01 WS-YEAR-LENGTH PIC 9(3). PROCEDURE DIVISION. YEAR-PROGRESS-REPORT. ACCEPT WS-CURRENT-JULIAN FROM DAY YYYYDDD MOVE WS-CURRENT-JULIAN(1:4) TO WS-YEAR MOVE WS-CURRENT-JULIAN(5:3) TO WS-DAY-OF-YEAR *> Determine year length (leap year consideration) PERFORM CHECK-LEAP-YEAR IF WS-LEAP-YEAR-FLAG = 'Y' MOVE 366 TO WS-YEAR-LENGTH ELSE MOVE 365 TO WS-YEAR-LENGTH END-IF COMPUTE WS-DAYS-REMAINING = WS-YEAR-LENGTH - WS-DAY-OF-YEAR COMPUTE WS-PERCENT-COMPLETE = (WS-DAY-OF-YEAR / WS-YEAR-LENGTH) * 100 DISPLAY "Year Progress Report for " WS-YEAR DISPLAY "==============================" DISPLAY "Current day of year: " WS-DAY-OF-YEAR DISPLAY "Days remaining: " WS-DAYS-REMAINING DISPLAY "Year completion: " WS-PERCENT-COMPLETE "%". QUARTER-DETERMINATION. 01 WS-QUARTER PIC 9. 01 WS-QUARTER-NAME PIC X(10). EVALUATE WS-DAY-OF-YEAR WHEN 1 THRU 90 MOVE 1 TO WS-QUARTER MOVE "First" TO WS-QUARTER-NAME WHEN 91 THRU 181 MOVE 2 TO WS-QUARTER MOVE "Second" TO WS-QUARTER-NAME WHEN 182 THRU 273 MOVE 3 TO WS-QUARTER MOVE "Third" TO WS-QUARTER-NAME WHEN 274 THRU 366 MOVE 4 TO WS-QUARTER MOVE "Fourth" TO WS-QUARTER-NAME END-EVALUATE DISPLAY "Current Quarter: " WS-QUARTER-NAME " (" WS-QUARTER ")".
12345678910111213141516171819202122232425262728293031323334353637383940414243444546WORKING-STORAGE SECTION. 01 WS-JULIAN-INPUT PIC 9(7). 01 WS-VALID-JULIAN-FLAG PIC X VALUE 'Y'. 01 WS-YEAR PIC 9(4). 01 WS-DAY-OF-YEAR PIC 9(3). 01 WS-MAX-DAY PIC 9(3). PROCEDURE DIVISION. VALIDATE-JULIAN-DATE. MOVE 'Y' TO WS-VALID-JULIAN-FLAG *> Extract components MOVE WS-JULIAN-INPUT(1:4) TO WS-YEAR MOVE WS-JULIAN-INPUT(5:3) TO WS-DAY-OF-YEAR *> Validate year (reasonable range) IF WS-YEAR < 1900 OR WS-YEAR > 2100 MOVE 'N' TO WS-VALID-JULIAN-FLAG DISPLAY "Invalid year: " WS-YEAR END-IF *> Determine maximum day for the year PERFORM CHECK-LEAP-YEAR IF WS-LEAP-YEAR-FLAG = 'Y' MOVE 366 TO WS-MAX-DAY ELSE MOVE 365 TO WS-MAX-DAY END-IF *> Validate day of year IF WS-DAY-OF-YEAR < 1 OR WS-DAY-OF-YEAR > WS-MAX-DAY MOVE 'N' TO WS-VALID-JULIAN-FLAG DISPLAY "Invalid day of year: " WS-DAY-OF-YEAR DISPLAY "Valid range: 1 to " WS-MAX-DAY END-IF *> Try COBOL intrinsic function validation IF WS-VALID-JULIAN-FLAG = 'Y' EVALUATE TRUE WHEN FUNCTION TEST-DAY-YYYYDDD(WS-JULIAN-INPUT) = 0 DISPLAY "Julian date is valid: " WS-JULIAN-INPUT WHEN OTHER MOVE 'N' TO WS-VALID-JULIAN-FLAG DISPLAY "Julian date failed intrinsic validation" END-EVALUATE END-IF.
DAY returns a 5-digit Julian date in YYDDD format (2-digit year), while DAY YYYYDDD returns a 7-digit format with a 4-digit year (YYYYDDD), which is Y2K compliant and recommended for new applications.
Julian dates are useful for sequential date processing, calculating days between dates within the same year, and when you need a simple numeric representation of dates for sorting or arithmetic operations.
Use COBOL's intrinsic functions INTEGER-OF-DAY and DAY-OF-INTEGER for arithmetic operations that may cross year boundaries. These functions handle leap years and year transitions automatically.
Use the TEST-DAY-YYYYDDD intrinsic function for validation, or manually check that the year is reasonable and the day-of-year is between 1 and 365 (or 366 for leap years).