MainframeMaster

COBOL Tutorial

COBOL DAY-OF-WEEK Function

The DAY-OF-WEEK function in COBOL determines which day of the week a given date falls on, returning an integer value from 1 (Monday) to 7 (Sunday) according to ISO 8601 standard.

Basic DAY-OF-WEEK Usage

cobol
1
2
3
4
5
6
7
8
9
10
11
*> DAY-OF-WEEK function syntax FUNCTION DAY-OF-WEEK(integer-date) *> Returns: *> 1 = Monday *> 2 = Tuesday *> 3 = Wednesday *> 4 = Thursday *> 5 = Friday *> 6 = Saturday *> 7 = Sunday

Getting Day of Week for Dates

Current Day of Week

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
WORKING-STORAGE SECTION. 01 WS-CURRENT-DATE PIC 9(8). 01 WS-INTEGER-DATE PIC 9(7). 01 WS-DAY-OF-WEEK PIC 9. 01 WS-DAY-NAME PIC X(9). 01 WS-DAY-NAMES. 05 FILLER PIC X(9) VALUE "Monday ". 05 FILLER PIC X(9) VALUE "Tuesday ". 05 FILLER PIC X(9) VALUE "Wednesday". 05 FILLER PIC X(9) VALUE "Thursday ". 05 FILLER PIC X(9) VALUE "Friday ". 05 FILLER PIC X(9) VALUE "Saturday ". 05 FILLER PIC X(9) VALUE "Sunday ". 01 WS-WEEKDAY-TABLE REDEFINES WS-DAY-NAMES. 05 WS-WEEKDAY PIC X(9) OCCURS 7 TIMES. PROCEDURE DIVISION. GET-CURRENT-DAY-OF-WEEK. *> Get current date ACCEPT WS-CURRENT-DATE FROM DATE YYYYMMDD *> Convert to integer date COMPUTE WS-INTEGER-DATE = FUNCTION INTEGER-OF-DATE(WS-CURRENT-DATE) *> Get day of week COMPUTE WS-DAY-OF-WEEK = FUNCTION DAY-OF-WEEK(WS-INTEGER-DATE) *> Get day name MOVE WS-WEEKDAY(WS-DAY-OF-WEEK) TO WS-DAY-NAME DISPLAY "Current Date: " WS-CURRENT-DATE DISPLAY "Day of Week Number: " WS-DAY-OF-WEEK DISPLAY "Day Name: " WS-DAY-NAME.

Day of Week for Specific Dates

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
WORKING-STORAGE SECTION. 01 WS-TEST-DATES. 05 WS-DATE-1 PIC 9(8) VALUE 20231225. *> Christmas 2023 05 WS-DATE-2 PIC 9(8) VALUE 20240101. *> New Year 2024 05 WS-DATE-3 PIC 9(8) VALUE 20240704. *> July 4th 2024 01 WS-DATE-COUNTER PIC 9. 01 WS-CURRENT-TEST-DATE PIC 9(8). 01 WS-DOW PIC 9. 01 WS-FORMATTED-DATE PIC X(10). PROCEDURE DIVISION. TEST-MULTIPLE-DATES. PERFORM VARYING WS-DATE-COUNTER FROM 1 BY 1 UNTIL WS-DATE-COUNTER > 3 EVALUATE WS-DATE-COUNTER WHEN 1 MOVE WS-DATE-1 TO WS-CURRENT-TEST-DATE WHEN 2 MOVE WS-DATE-2 TO WS-CURRENT-TEST-DATE WHEN 3 MOVE WS-DATE-3 TO WS-CURRENT-TEST-DATE END-EVALUATE *> Format date for display STRING WS-CURRENT-TEST-DATE(5:2) "/" WS-CURRENT-TEST-DATE(7:2) "/" WS-CURRENT-TEST-DATE(1:4) DELIMITED BY SIZE INTO WS-FORMATTED-DATE *> Calculate day of week COMPUTE WS-DOW = FUNCTION DAY-OF-WEEK( FUNCTION INTEGER-OF-DATE(WS-CURRENT-TEST-DATE)) DISPLAY "Date: " WS-FORMATTED-DATE " is a " WS-WEEKDAY(WS-DOW) END-PERFORM.

Business Day Calculations

Weekend Detection

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
WORKING-STORAGE SECTION. 01 WS-INPUT-DATE PIC 9(8). 01 WS-DAY-OF-WEEK PIC 9. 01 WS-IS-WEEKEND PIC X. 88 WEEKEND VALUE 'Y'. 88 WEEKDAY VALUE 'N'. 01 WS-IS-BUSINESS-DAY PIC X. 88 BUSINESS-DAY VALUE 'Y'. 88 NON-BUSINESS-DAY VALUE 'N'. PROCEDURE DIVISION. CHECK-WEEKEND. ACCEPT WS-INPUT-DATE FROM DATE YYYYMMDD COMPUTE WS-DAY-OF-WEEK = FUNCTION DAY-OF-WEEK( FUNCTION INTEGER-OF-DATE(WS-INPUT-DATE)) *> Check if weekend (Saturday=6, Sunday=7) IF WS-DAY-OF-WEEK = 6 OR WS-DAY-OF-WEEK = 7 SET WEEKEND TO TRUE SET NON-BUSINESS-DAY TO TRUE DISPLAY "Date " WS-INPUT-DATE " is a weekend" ELSE SET WEEKDAY TO TRUE SET BUSINESS-DAY TO TRUE DISPLAY "Date " WS-INPUT-DATE " is a weekday" END-IF *> Display day name DISPLAY "Day of week: " WS-WEEKDAY(WS-DAY-OF-WEEK). COUNT-BUSINESS-DAYS. 01 WS-START-DATE PIC 9(8) VALUE 20231201. 01 WS-END-DATE PIC 9(8) VALUE 20231231. 01 WS-CURRENT-DATE PIC 9(8). 01 WS-CURRENT-INTEGER PIC 9(7). 01 WS-END-INTEGER PIC 9(7). 01 WS-BUSINESS-DAYS PIC 9(3) VALUE ZERO. 01 WS-WEEKEND-DAYS PIC 9(3) VALUE ZERO. 01 WS-TOTAL-DAYS PIC 9(3) VALUE ZERO. COMPUTE WS-CURRENT-INTEGER = FUNCTION INTEGER-OF-DATE(WS-START-DATE) COMPUTE WS-END-INTEGER = FUNCTION INTEGER-OF-DATE(WS-END-DATE) PERFORM UNTIL WS-CURRENT-INTEGER > WS-END-INTEGER ADD 1 TO WS-TOTAL-DAYS COMPUTE WS-DAY-OF-WEEK = FUNCTION DAY-OF-WEEK(WS-CURRENT-INTEGER) IF WS-DAY-OF-WEEK >= 1 AND WS-DAY-OF-WEEK <= 5 ADD 1 TO WS-BUSINESS-DAYS ELSE ADD 1 TO WS-WEEKEND-DAYS END-IF ADD 1 TO WS-CURRENT-INTEGER END-PERFORM DISPLAY "Period: " WS-START-DATE " to " WS-END-DATE DISPLAY "Total days: " WS-TOTAL-DAYS DISPLAY "Business days: " WS-BUSINESS-DAYS DISPLAY "Weekend days: " WS-WEEKEND-DAYS.

Next Business Day Calculation

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
WORKING-STORAGE SECTION. 01 WS-INPUT-DATE PIC 9(8). 01 WS-NEXT-BUSINESS-DATE PIC 9(8). 01 WS-WORKING-INTEGER PIC 9(7). 01 WS-WORKING-DOW PIC 9. 01 WS-DAYS-ADDED PIC 9(2) VALUE ZERO. PROCEDURE DIVISION. FIND-NEXT-BUSINESS-DAY. ACCEPT WS-INPUT-DATE FROM DATE YYYYMMDD COMPUTE WS-WORKING-INTEGER = FUNCTION INTEGER-OF-DATE(WS-INPUT-DATE) *> Start with next day ADD 1 TO WS-WORKING-INTEGER ADD 1 TO WS-DAYS-ADDED *> Keep adding days until we find a weekday PERFORM UNTIL WS-WORKING-DOW >= 1 AND WS-WORKING-DOW <= 5 COMPUTE WS-WORKING-DOW = FUNCTION DAY-OF-WEEK(WS-WORKING-INTEGER) IF WS-WORKING-DOW = 6 OR WS-WORKING-DOW = 7 ADD 1 TO WS-WORKING-INTEGER ADD 1 TO WS-DAYS-ADDED END-IF END-PERFORM COMPUTE WS-NEXT-BUSINESS-DATE = FUNCTION DATE-OF-INTEGER(WS-WORKING-INTEGER) DISPLAY "Input date: " WS-INPUT-DATE DISPLAY "Next business day: " WS-NEXT-BUSINESS-DATE DISPLAY "Days added: " WS-DAYS-ADDED. FIND-PREVIOUS-BUSINESS-DAY. 01 WS-PREV-BUSINESS-DATE PIC 9(8). 01 WS-PREV-INTEGER PIC 9(7). 01 WS-PREV-DOW PIC 9. 01 WS-DAYS-SUBTRACTED PIC 9(2) VALUE ZERO. COMPUTE WS-PREV-INTEGER = FUNCTION INTEGER-OF-DATE(WS-INPUT-DATE) *> Start with previous day SUBTRACT 1 FROM WS-PREV-INTEGER ADD 1 TO WS-DAYS-SUBTRACTED *> Keep subtracting days until we find a weekday PERFORM UNTIL WS-PREV-DOW >= 1 AND WS-PREV-DOW <= 5 COMPUTE WS-PREV-DOW = FUNCTION DAY-OF-WEEK(WS-PREV-INTEGER) IF WS-PREV-DOW = 6 OR WS-PREV-DOW = 7 SUBTRACT 1 FROM WS-PREV-INTEGER ADD 1 TO WS-DAYS-SUBTRACTED END-IF END-PERFORM COMPUTE WS-PREV-BUSINESS-DATE = FUNCTION DATE-OF-INTEGER(WS-PREV-INTEGER) DISPLAY "Previous business day: " WS-PREV-BUSINESS-DATE DISPLAY "Days subtracted: " WS-DAYS-SUBTRACTED.

Advanced Day-of-Week Applications

Monthly Calendar Generation

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
WORKING-STORAGE SECTION. 01 WS-YEAR PIC 9(4) VALUE 2023. 01 WS-MONTH PIC 9(2) VALUE 12. 01 WS-FIRST-OF-MONTH PIC 9(8). 01 WS-FIRST-DOW PIC 9. 01 WS-DAYS-IN-MONTH PIC 9(2). 01 WS-CALENDAR-LINE PIC X(21). 01 WS-DAY-COUNTER PIC 9(2). 01 WS-POSITION PIC 9(2). 01 WS-CURRENT-DATE-STR PIC X(2). PROCEDURE DIVISION. GENERATE-MONTHLY-CALENDAR. *> Build first day of month STRING WS-YEAR WS-MONTH "01" DELIMITED BY SIZE INTO WS-FIRST-OF-MONTH *> Get day of week for first day COMPUTE WS-FIRST-DOW = FUNCTION DAY-OF-WEEK( FUNCTION INTEGER-OF-DATE(WS-FIRST-OF-MONTH)) *> Get days in month PERFORM GET-DAYS-IN-MONTH *> Display calendar header DISPLAY "Calendar for " WS-MONTH "/" WS-YEAR DISPLAY "Mo Tu We Th Fr Sa Su" DISPLAY "-------------------" *> Initialize first line with spaces for days before month starts MOVE SPACES TO WS-CALENDAR-LINE COMPUTE WS-POSITION = (WS-FIRST-DOW - 1) * 3 + 1 *> Fill in the days PERFORM VARYING WS-DAY-COUNTER FROM 1 BY 1 UNTIL WS-DAY-COUNTER > WS-DAYS-IN-MONTH *> Format day number MOVE WS-DAY-COUNTER TO WS-CURRENT-DATE-STR *> Place in calendar line MOVE WS-CURRENT-DATE-STR TO WS-CALENDAR-LINE(WS-POSITION:2) *> Move to next position ADD 3 TO WS-POSITION *> Check if end of week (Sunday) or end of month IF WS-POSITION > 21 OR WS-DAY-COUNTER = WS-DAYS-IN-MONTH DISPLAY WS-CALENDAR-LINE MOVE SPACES TO WS-CALENDAR-LINE MOVE 1 TO WS-POSITION END-IF END-PERFORM. GET-DAYS-IN-MONTH. EVALUATE WS-MONTH WHEN 1 OR 3 OR 5 OR 7 OR 8 OR 10 OR 12 MOVE 31 TO WS-DAYS-IN-MONTH WHEN 4 OR 6 OR 9 OR 11 MOVE 30 TO WS-DAYS-IN-MONTH WHEN 2 *> Check for leap year IF FUNCTION MOD(WS-YEAR, 4) = 0 IF FUNCTION MOD(WS-YEAR, 100) = 0 IF FUNCTION MOD(WS-YEAR, 400) = 0 MOVE 29 TO WS-DAYS-IN-MONTH ELSE MOVE 28 TO WS-DAYS-IN-MONTH END-IF ELSE MOVE 29 TO WS-DAYS-IN-MONTH END-IF ELSE MOVE 28 TO WS-DAYS-IN-MONTH END-IF END-EVALUATE.

Recurring Date Calculations

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
WORKING-STORAGE SECTION. 01 WS-TARGET-DOW PIC 9 VALUE 1. *> Monday 01 WS-OCCURRENCE PIC 9 VALUE 2. *> Second occurrence 01 WS-YEAR PIC 9(4) VALUE 2024. 01 WS-MONTH PIC 9(2) VALUE 3. *> March 01 WS-RESULT-DATE PIC 9(8). 01 WS-FIRST-OF-MONTH PIC 9(8). 01 WS-CURRENT-INTEGER PIC 9(7). 01 WS-CURRENT-DOW PIC 9. 01 WS-OCCURRENCE-COUNT PIC 9 VALUE ZERO. PROCEDURE DIVISION. FIND-NTH-WEEKDAY-IN-MONTH. *> Find the second Monday in March 2024 *> Build first day of month STRING WS-YEAR WS-MONTH "01" DELIMITED BY SIZE INTO WS-FIRST-OF-MONTH COMPUTE WS-CURRENT-INTEGER = FUNCTION INTEGER-OF-DATE(WS-FIRST-OF-MONTH) *> Search for the nth occurrence of target weekday PERFORM UNTIL WS-OCCURRENCE-COUNT = WS-OCCURRENCE COMPUTE WS-CURRENT-DOW = FUNCTION DAY-OF-WEEK(WS-CURRENT-INTEGER) IF WS-CURRENT-DOW = WS-TARGET-DOW ADD 1 TO WS-OCCURRENCE-COUNT IF WS-OCCURRENCE-COUNT = WS-OCCURRENCE COMPUTE WS-RESULT-DATE = FUNCTION DATE-OF-INTEGER(WS-CURRENT-INTEGER) EXIT PERFORM END-IF END-IF ADD 1 TO WS-CURRENT-INTEGER *> Safety check - don't go beyond month IF WS-CURRENT-INTEGER > FUNCTION INTEGER-OF-DATE(WS-FIRST-OF-MONTH) + 31 MOVE ZERO TO WS-RESULT-DATE EXIT PERFORM END-IF END-PERFORM IF WS-RESULT-DATE > ZERO DISPLAY "The " WS-OCCURRENCE " occurrence of " WS-WEEKDAY(WS-TARGET-DOW) " in " WS-MONTH "/" WS-YEAR " is " WS-RESULT-DATE ELSE DISPLAY "No " WS-OCCURRENCE " occurrence found" END-IF.

Related Topics

  • DATE Function
  • DAY Function
  • INTEGER-OF-DATE Function
  • DATE-OF-INTEGER Function
  • Business Day Calculations
  • Calendar Processing

Frequently Asked Questions

What numbering system does DAY-OF-WEEK use?

DAY-OF-WEEK follows ISO 8601 standard where Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, and Sunday=7. This differs from some other systems that start with Sunday=0 or Sunday=1.

How do I identify business days vs weekends?

Business days are typically Monday through Friday (values 1-5), while weekends are Saturday and Sunday (values 6-7). Use conditional logic to check if DAY-OF-WEEK returns a value between 1 and 5 for business days.

Can I use DAY-OF-WEEK for holiday calculations?

DAY-OF-WEEK helps determine the day of week for holidays, but you'll need additional logic for holiday rules (like "first Monday in September" for Labor Day) and to handle holidays that fall on weekends.

How accurate is DAY-OF-WEEK for historical dates?

DAY-OF-WEEK is accurate for dates within COBOL's supported range, typically from 1601 onward. It properly handles the Gregorian calendar including leap year rules and historical calendar transitions.