diff --git a/src/js/datetime.ts b/src/js/datetime.ts index c03c14b2b..21b77454d 100644 --- a/src/js/datetime.ts +++ b/src/js/datetime.ts @@ -938,7 +938,12 @@ export class DateTime extends Date { const y = year || dt.getFullYear(); let M = 0; if (!(year && !month)) { - M = month > 0 ? month - 1 : dt.getMonth(); + M = + month > 0 + ? localization.monthZeroIndex + ? month + : month - 1 + : dt.getMonth(); } if (zone) { return new DateTime( diff --git a/src/js/display/calendar/date-display.ts b/src/js/display/calendar/date-display.ts index 90ac6679f..ca67367d3 100644 --- a/src/js/display/calendar/date-display.ts +++ b/src/js/display/calendar/date-display.ts @@ -179,6 +179,7 @@ export default class DateDisplay { // format the string to a date const innerDate = DateTime.fromString(attributeValue, { format: 'yyyy-MM-dd', + monthZeroIndex: true, }); // find the position of the target in the date container @@ -192,7 +193,7 @@ export default class DateDisplay { //format the start date so that it can be found by the attribute const rangeStartFormatted = this._dateToDataValue(rangeStart); - const rangeStartIndex = allDays.findIndex( + let rangeStartIndex = allDays.findIndex( (e) => e.getAttribute('data-value') === rangeStartFormatted ); const rangeStartElement = allDays[rangeStartIndex]; @@ -214,6 +215,9 @@ export default class DateDisplay { let lambda: (_, index) => boolean; if (innerDate.isBefore(rangeStart)) { + if (rangeStartElement === undefined) { + rangeStartIndex = Number.MAX_SAFE_INTEGER; + } currentTarget.classList.add(Namespace.css.rangeStart); rangeStartElement?.classList.remove(Namespace.css.rangeStart); rangeStartElement?.classList.add(Namespace.css.rangeEnd); diff --git a/src/js/utilities/options.ts b/src/js/utilities/options.ts index ed759315c..b7fd5cd81 100644 --- a/src/js/utilities/options.ts +++ b/src/js/utilities/options.ts @@ -77,6 +77,7 @@ export interface FormatLocalization { hourCycle?: Intl.LocaleHourCycleKey; locale?: string; ordinal?: (n: number) => any; //eslint-disable-line @typescript-eslint/no-explicit-any + monthZeroIndex?: boolean; } export interface Localization extends FormatLocalization { diff --git a/test/datetime.test.ts b/test/datetime.test.ts index 71498f2a5..d1ceba974 100644 --- a/test/datetime.test.ts +++ b/test/datetime.test.ts @@ -75,6 +75,22 @@ test('Can create with string', () => { expect(dt.month).toBe(12 - 1); //minus 1 because javascript 🙄 expect(dt.date).toBe(31); expect(dt.year).toBe(2022); + + const zeroIndexMonthDt = DateTime.fromString('2024-11-01', { + format: 'yyyy-MM-dd', + monthZeroIndex: true, + }); + expect(zeroIndexMonthDt.year).toBe(2024); + expect(zeroIndexMonthDt.month).toBe(11); + expect(zeroIndexMonthDt.date).toBe(1); + + const nonZeroIndexMonthDt = DateTime.fromString('2024-11-01', { + format: 'yyyy-MM-dd', + monthZeroIndex: false, + }); + expect(nonZeroIndexMonthDt.year).toBe(2024); + expect(nonZeroIndexMonthDt.month).toBe(10); + expect(nonZeroIndexMonthDt.date).toBe(1); }); test('Can create clone', () => {