Date and time functions

WORKDAY.INTL

Matches all 6,022 recorded answers

Recorded: 6,000 in the answer bank and 22 workbook cells. How we measure this · See the Rust code

Local names in 40 languages
LanguageName in Excel
ArabicWORKDAY.INTL
BulgarianWORKDAY.INTL
CzechWORKDAY.INTL
DanishARBEJDSDAG.INTL
GermanWORKDAY.INTL
GreekWORKDAY.INTL
English (Australia)WORKDAY.INTL
English (United Kingdom)WORKDAY.INTL
English (United States)WORKDAY.INTL
SpanishDIA.LAB.INTL
EstonianWORKDAY.INTL
FinnishTYÖPÄIVÄ.KANSVÄL
FrenchSERIE.JOUR.OUVRE.INTL
HebrewWORKDAY.INTL
CroatianWORKDAY.INTL
HungarianKALK.MUNKANAP.INTL
IndonesianWORKDAY.INTL
ItalianWORKDAY.INTL
JapaneseWORKDAY.INTL
KoreanWORKDAY.INTL
LithuanianWORKDAY.INTL
LatvianWORKDAY.INTL
NorwegianWORKDAY.INTL
DutchWERKDAG.INTL
PolishDZIEŃ.ROBOCZY.NIESTAND
Portuguese (Brazil)WORKDAY.INTL
Portuguese (Portugal)DIATRABALHO.INTL
RomanianWORKDAY.INTL
RussianРАБДЕНЬ.МЕЖД
SlovakWORKDAY.INTL
SlovenianWORKDAY.INTL
Serbian (Latin)WORKDAY.INTL
SwedishARBETSDAGAR.INT
ThaiWORKDAY.INTL
TurkishİŞGÜNÜ.ULUSL
UkrainianWORKDAY.INTL
VietnameseWORKDAY.INTL
Chinese (Simplified)WORKDAY.INTL
Chinese (Hong Kong)WORKDAY.INTL
Chinese (Traditional)WORKDAY.INTL

Names from Microsoft's support site.

What it does

WORKDAY.INTL(start_date, days, [weekend], [holidays])

WORKDAY.INTL returns the date lying a given number of working days before or after a start date, where which days are weekend is an argument rather than a fixed Saturday and Sunday. It is to WORKDAY what NETWORKDAYS.INTL is to NETWORKDAYS, and it shares the .INTL weekend argument with the former exactly.

The operation is unchanged from WORKDAY: step away from start_date in the direction of days, consuming one unit of the count for each working day stepped onto, and return where you land. Only the definition of "working day" is now parameterized.

Arguments

WORKDAY.INTL(start_date, days, [weekend], [holidays]) — two required and two optional.

start_date — the date to offset from.

days — the number of working days to move; positive forward, negative backward. WORKDAY's page documents that a non-integer days is truncated, and the same rule is expected here.

weekend — optional; the same two-shaped argument documented for NETWORKDAYS.INTL.

As a number:

NumberWeekend days
1 (default)Saturday, Sunday
2Sunday, Monday
3Monday, Tuesday
4Tuesday, Wednesday
5Wednesday, Thursday
6Thursday, Friday
7Friday, Saturday
11Sunday only
12Monday only
13Tuesday only
14Wednesday only
15Thursday only
16Friday only
17Saturday only

Codes 1–7 are consecutive pairs starting one day later each time from Saturday; codes 11–17 are single days running Sunday through Saturday. The two blocks do not share an origin, and neither aligns with WEEKDAY's numbering.

As a string: seven characters, one per weekday starting with Monday, "1" for a non-workday and "0" for a workday; only those two characters are permitted. Microsoft's WORKDAY.INTL page adds a rule its sibling's page does not state in the same words: "1111111" is invalid, because at least one workday is required. That prohibition is structurally necessary here in a way it is not for a counting function — a week with no working days makes the offset non-terminating, whereas a count over such a week is simply zero.

holidays — optional range or array of dates to exclude.

The foot-gun is unchanged from the sibling and worth repeating: an unquoted 0000011 is the number 11, a valid weekend code meaning "Sunday only". It produces a plausible wrong answer, not an error.

Try it

Input cells (optional)

Example: {"B2": 3, "B3": 4}. A1 holds the formula. Other cells need values before a formula can read them.

Enter a formula, then calculate.

Runs locally in your browser with OneCalc. Its answer may differ from Excel. Use English function names and commas between arguments.

Quirks

Result and edge cases

Returns a Number: a whole date serial.

  • days = 0 exposes the counting convention, exactly as on WORKDAY, and the page is equally silent about it. Whether a start date falling on a weekend is returned unchanged or snapped is the diagnostic case.
  • A six-day weekend leaves one working day per week, which is legal and makes offsets large in calendar terms — a good stress case for any closed-form implementation.
  • Holidays that fall on weekend days should contribute nothing; undocumented.
  • Consecutive holidays require the exclusion pass to iterate; see the implementer notes.
  • Blank cells in a holidays range raise the Empty-versus-Missing question from the value universe; serial 0 is a representable date.

Errors

Documented on the Microsoft page, and this is the fullest error table in the family:

  • #NUM! when "start_date is out of range for the current date base value".
  • #NUM! when "any date in holidays is out of range for the current date base value".
  • #NUM! when "start_date plus day-offset yields an invalid date".
  • #VALUE! when "a weekend string is of invalid length or contains invalid characters".

Two observations the Handbook records rather than smooths over:

  1. The holidays condition is documented here and not on WORKDAY's page, which mentions only "any argument is not a valid date" (#VALUE!). Two functions performing the same holiday exclusion, documented with different error values for an out-of-range holiday.
  2. Only the string form of weekend has a documented invalidity condition. What an out-of-table numeric code does is not stated. Code 0 gives #NUM! (FN-NETWORKDAYS.INTL-001); 8, 10 and 18 are not asserted here.

NETWORKDAYS.INTL checks weekend before the dates, WORKDAY.INTL after them

The two functions read their arguments in different orders. NETWORKDAYS.INTL decodes weekend first: with #REF! in the cell for start_date and weekend 0, the answer is #NUM!, from the invalid weekend. WORKDAY.INTL reads start_date first and gives #REF! for the same arguments. An error held in the weekend cell is also treated differently: with start 2 and second argument 5, NETWORKDAYS.INTL gives #VALUE! and WORKDAY.INTL gives #NUM!. Neither returns the error itself. A logical weekend is read as a number: NETWORKDAYS.INTL(2,5,TRUE) is 4, as with weekend 1, and FALSE is #NUM!, as with weekend 0. WORKDAY.INTL does the same.

FormulaExcelMathematical value
NETWORKDAYS.INTL(A1, 5, 0)
Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading file
Inputs and reference value

Number supplied through a cell.

start_date: #REF!

end_date: 5
0x4014000000000000

weekend: 0
0x0000000000000000

#NUM!—
WORKDAY.INTL(A1, 5, 0)
Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading file
Inputs and reference value

Number supplied through a cell.

start_date: #REF!

days: 5
0x4014000000000000

weekend: 0
0x0000000000000000

#REF!—
NETWORKDAYS.INTL(2, 5, A3)
Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading file
Inputs and reference value

Number supplied through a cell.

start_date: 2
0x4000000000000000

end_date: 5
0x4014000000000000

weekend: #REF!

#VALUE!—
WORKDAY.INTL(2, 5, A3)
Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading file
Inputs and reference value

Number supplied through a cell.

start_date: 2
0x4000000000000000

days: 5
0x4014000000000000

weekend: #REF!

#NUM!—
=NETWORKDAYS.INTL(2,5,TRUE)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Typed formula.

4
0x4010000000000000
—
=NETWORKDAYS.INTL(2,5,FALSE)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Typed formula.

#NUM!—
=WORKDAY.INTL(2,2,TRUE)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Typed formula.

4
0x4010000000000000
—
=WORKDAY.INTL(2,2,FALSE)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Typed formula.

#NUM!—

Inputs, build details and evidence

An empty cell as a first date is serial 0, but a logical in that cell is #VALUE!

A reference to an empty cell as the first date of these functions reads as serial 0 and gives a normal answer: NETWORKDAYS(B1,5) is 4 and WORKDAY(B1,2) is 3. YEARFRAC(B1,5,0) is 5/360. TRUE in the same cell gives #VALUE!, as a direct TRUE does, so a blank is not treated as the logical FALSE either.

FormulaExcelMathematical value
=NETWORKDAYS(B1,5)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Number supplied through a cell.

B1: (empty cell)

4
0x4010000000000000
—
=NETWORKDAYS(B1,5)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Number supplied through a cell.

B1: TRUE

#VALUE!—
=WORKDAY(B1,2)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Number supplied through a cell.

B1: (empty cell)

3
0x4008000000000000
—
=WORKDAY(B1,2)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Number supplied through a cell.

B1: TRUE

#VALUE!—
=NETWORKDAYS.INTL(B1,5,1)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Number supplied through a cell.

B1: (empty cell)

4
0x4010000000000000
—
=WORKDAY.INTL(B1,2,1)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Number supplied through a cell.

B1: (empty cell)

3
0x4008000000000000
—
=YEARFRAC(B1,5,0)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Number supplied through a cell.

B1: (empty cell)

0.013888888888888888
0x3f8c71c71c71c71c
—
=TBILLEQ(B1,5,0.1)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Number supplied through a cell.

B1: (empty cell)

0.10152990264255911
0x3fb9fddd1b6a757f
—

Inputs, build details and evidence

How to implement

Notes for implementers

  1. Normalize weekend to a seven-bit mask once start_date has been read, the order Excel uses (FN-NETWORKDAYS.INTL-001), from either shape, and reject the all-ones mask here even if the counting sibling tolerates it — an offset over a week with no working days does not terminate.
  2. Use whole-week arithmetic. With w = popcount(¬mask) working days per week, days decomposes into ⌊days/w⌋ whole weeks plus a remainder resolved against the start day's position in the week. Stepping day by day is correct and unusably slow across the serial range.
  3. Iterate the holiday exclusion to a fixed point. Skipping a holiday moves the target, which may itself be a holiday; a single pass is wrong for consecutive holidays.
  4. Keep the days = 0 convention identical to WORKDAY's, whatever it turns out to be.
  5. Do not share the error path with WORKDAY until the documented divergence above is resolved by observation.

Rust code

Show the CalcFunc source of this function

Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.

WORKDAY.INTL · 3 lines · calc-func/src/catalogue/dates.rs on GitHub
20 workday_intl_fn "WORKDAY.INTL" (2, 4) [V "start_date", V "days", V "weekend", R "holidays"] |s, a, sv| {
    workday(s, a, sv, true)
}

Kernels shared with other functions

Argument and result plumbing

No implementation has been published with a Handbook test suite for this function.

Version differences

The recorded environments below distinguish a reading from a same-input comparison. Counts describe captured inputs in each environment; overlapping captures and comparisons are not totals of unique worksheet calls.

Excel 16.0 buildPlatform and CPUCaptured inputs
20430Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics4,800

The record contains no same-input comparison between these environments. Reading different inputs on different builds does not establish either a version change or cross-build agreement.

Recorded environments and comparison details.

Excel 16.0.20527.20088

Windows, bitness and CPU not recorded in this reading file

WORKDAY.INTL(A1, 5, 0) returned #REF!. WORKDAY.INTL(2, 5, A3) returned #NUM!. Inputs were supplied through cells using Value2. These are controls from this environment, not a same-input comparison with another build.

Observed formulas and results
  • WORKDAY.INTL(A1, 5, 0) → #REF! (cell-value2)
  • WORKDAY.INTL(2, 5, A3) → #NUM! (cell-value2)

Excel 16.0.20527.20088

Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA

=WORKDAY.INTL(2,2,TRUE) returned 4 (0x4010000000000000). =WORKDAY.INTL(2,2,FALSE) returned #NUM!. 1 further recorded control is attached. Inputs were supplied through cells using Value2, formula literals. These are controls from this environment, not a same-input comparison with another build.

Observed formulas and results
  • =WORKDAY.INTL(2,2,TRUE) → 4
    0x4010000000000000 (formula-literal)
  • =WORKDAY.INTL(2,2,FALSE) → #NUM! (formula-literal)
  • =WORKDAY.INTL(B1,2,1) → 3
    0x4008000000000000 (cell-value2)

Excel 16.0 build 20430

Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics

4,800 captured inputs are indexed for this environment. Capture dates: 2026-09-24 to 2026-09-25. This is a reading count, not a comparison with another build.

Alternatives

Relationships

  • WORKDAY — the un-generalized original. WORKDAY(a,n,h) should equal WORKDAY.INTL(a,n,1,h); unverified here.
  • NETWORKDAYS.INTL — the inverse operation, sharing this exact weekend argument. Their weekend interpretations must agree or the family is incoherent; that they do is assumed and unchecked.
  • NETWORKDAYS — the un-generalized inverse.
  • EDATE — month offsetting, the other "move a date by whole units" function, with the same documented truncation rule for its offset argument.

Named variants

No named variants are recorded yet.

Suggest a correction or contribute an implementation · For agents