Excel 16.0 build 20430
Windows, 64-bit, CPU not recorded
9,838 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.
Date and time functions
Matches all 9,846 recorded answers
Recorded: 9,838 in the answer bank and 8 workbook cells. How we measure this · See the Rust code
| Language | Name in Excel |
|---|---|
| Arabic | EDATE |
| Bulgarian | EDATE |
| Czech | EDATE |
| Danish | EDATO |
| German | EDATE |
| Greek | EDATE |
| English (Australia) | EDATE |
| English (United Kingdom) | EDATE |
| English (United States) | EDATE |
| Spanish | FECHA.MES |
| Estonian | EDATE |
| Finnish | EDATE |
| French | MOIS.DECALER |
| Hebrew | EDATE |
| Croatian | EDATE |
| Hungarian | KALK.DÁTUM |
| Indonesian | EDATE |
| Italian | EDATE |
| Japanese | EDATE |
| Korean | EDATE |
| Lithuanian | EDATE |
| Latvian | EDATE |
| Norwegian | DAG.ETTER (funksjon) |
| Dutch | ZELFDE.DAG |
| Polish | NR.SER.DATY |
| Portuguese (Brazil) | EDATE |
| Portuguese (Portugal) | DATAM |
| Romanian | EDATE |
| Russian | ДАТАМЕС |
| Slovak | EDATE |
| Slovenian | EDATE |
| Serbian (Latin) | EDATE |
| Swedish | EDATUM |
| Thai | EDATE |
| Turkish | SERİTARİH işlevi |
| Ukrainian | EDATE |
| Vietnamese | EDATE |
| Chinese (Simplified) | EDATE |
| Chinese (Hong Kong) | EDATE |
| Chinese (Traditional) | EDATE |
Names from Microsoft's support site.
EDATE(start_date, months)
EDATE moves a date by a whole number of months, keeping the day-of-month. The serial it returns
denotes the day with the same day-of-month, in the month months steps away from start_date's
month.
The interesting part of that sentence is what it does not say, and the documentation does not say
it either. When the target month has no such day-of-month — 31 January offset by one month, or 29
February offset by twelve — some rule has to apply. Calendars generally clamp to the last day of
the target month, and EDATE is widely understood to clamp. Microsoft's EDATE page does not
state a rule for that case, and this Handbook has not verified Excel's behaviour. It is stated
here as the expected behaviour and nothing stronger.
That gap is the whole reason EDATE is not simply DATE(YEAR(s), MONTH(s)+n, DAY(s)). DATE
carries excess days forward — its documented rule turns a 31st in a 30-day month into the 1st of
the next month. If EDATE clamps, the two expressions disagree on exactly the dates people build
payment schedules from. If it does not clamp, EDATE is redundant. Either way, the answer is
load-bearing and it is not written down.
EDATE(start_date, months) — both required.
start_date — the date to offset. Microsoft's page repeats the category guidance: supply dates "by using the DATE function, or as results of other formulas or functions", not as text.
months — "the number of months before or after start_date. A positive value for months yields
a future date; a negative value yields a past date." The page states the conversion rule
explicitly: "If months is not an integer, it is truncated." Truncation, not rounding — so
EDATE(s, 1.9) is one month, and EDATE(s, -1.9) is, on the ordinary meaning of truncation, minus
one month rather than minus two. The behaviour of truncation on negative values is the part worth
testing, because languages disagree about it.
Returns a Number: a whole date serial, with no time component.
months = 0 returns the start date's own serial (with any time component dropped), which
makes EDATE(s,0) a serviceable "floor to whole day" idiom.months is truncated, per the documented rule.start_date — the page does not say whether the time component is truncated
before or after the offset. For whole-month arithmetic the two agree, so this is a low-stakes
gap, but it is a gap.As documented on the Microsoft EDATE page:
#VALUE! when start_date is not a valid date.That is the only condition the page states — and it is worth noticing that the sibling
EOMONTH page documents #NUM! for the corresponding situation, plus a second
#NUM! when start_date plus months yields an invalid date. Two functions of identical shape,
documented with different error values for the same failure. Whether Excel actually behaves
differently, or whether one of the two pages is simply wrong, is an open documentation
discrepancy that nobody has resolved against a running Excel for this Handbook. It is exactly the
kind of divergence claim-language rule 5 exists to keep visible
rather than silently harmonized.
EDATE's page does not document what happens when the result is out of range, though EOMONTH's
does for the same operation.
months toward zero, matching the documented word "truncated" — do not floor.
-1.9 truncates to -1 and floors to -2; the two give different answers for every negative
fractional offset.(y, m, d), add months to a zero-based month index with a floor-division carry,
then reconstruct — clamping d at the target month's length if that is the chosen rule.#VALUE!/#NUM! discrepancy above is
resolved, an implementation that shares one error path between EDATE and EOMONTH is making
an unverified compatibility bet.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.
EDATE · 5 lines · calc-func/src/catalogue/dates.rs on GitHub14 edate_fn "EDATE" (2, 2) [V "start_date", V "months"] |s, a, sv| {
let start = strict_date_arg(s, a, 0)?;
let months = strict_num(s, a, 1)?;
serial_out(s, k::edate(start, months))
}
edate · 11 lines · calc-func/src/ported/date_kernels.rs on GitHubpub(crate) fn edate(serial: f64, months: f64) -> Result<f64, W> {
let serial = whole_serial(serial)?;
let months = whole(months)?;
let (year, month, day) = ymd_1900(serial);
let (year, month) = shifted_month(year, month, months)?;
if !(1900..=9999).contains(&year) {
return Err(W::Num);
}
let day = day.min(days_in_month(year, month));
excel_serial_from_ymd(DateSystem::System1900, year, month, day).ok_or(W::Num)
}
environment catalogue/datessystem catalogue/datesto_1900 catalogue/datesfrom_1900 catalogue/datesdate_arg catalogue/datesstrict_date_arg catalogue/datesstrict_num catalogue/datesserial_out catalogue/datesdays_from_civil localeexcel_serial_from_ymd localedays_from_civil ported/date_kernelscivil_from_days ported/date_kernelsymd_1900 ported/date_kernelsis_leap ported/date_kernelsdays_in_month ported/date_kernelswhole_serial ported/date_kernelswhole ported/date_kernelsshifted_month ported/date_kernelsNo implementation has been published with a Handbook test suite for this function.
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 build | Platform and CPU | Captured inputs |
|---|---|---|
| 20430 | Windows, 64-bit, CPU not recorded | 9,838 |
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.
Windows, 64-bit, CPU not recorded
9,838 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.
EOMONTH(s, n) and EDATE(s, n) coincide exactly
when s is already a month end and the target month is no shorter.EDATE's (expected) clamping."M" — the inverse question: how many whole months lie
between two dates.EDATE and EOMONTH are near-interchangeable in appearance and never in
meaning; and EDATE(s, 12) is not the same as DATE(YEAR(s)+1, MONTH(s), DAY(s)) if the
clamping hypothesis holds and s is 29 February.No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents