From 612b4218244fcdbc314d10e2544b754c6529ed0b Mon Sep 17 00:00:00 2001 From: ybai08 <271969568+ybai08@users.noreply.github.com> Date: Sat, 17 Oct 2026 20:20:01 -0500 Subject: [PATCH] fix(en): accept a dot after the day number in little-endian dates "5. March 2019" lost its day and "23. October" became 1 October at 23:00, because the little-endian pattern did not allow the dot that often follows the day number. Allow an optional dot after the day and after the end day of a range. Fixes #283 --- .../parsers/ENMonthNameLittleEndianParser.ts | 4 +- test/en/en_month_name_little_endian.test.ts | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts b/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts index 259d557b..9b73e6cf 100644 --- a/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts +++ b/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts @@ -10,10 +10,10 @@ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/ // prettier-ignore const PATTERN = new RegExp( `(?:on\\s{0,3})?` + - `(${ORDINAL_NUMBER_PATTERN})` + + `(${ORDINAL_NUMBER_PATTERN})\\.?` + `(?:` + `\\s{0,3}(?:to|\\-|\\–|until|through|till)\\s{0,3}` + - `(${ORDINAL_NUMBER_PATTERN})` + + `(${ORDINAL_NUMBER_PATTERN})\\.?` + ")?" + `(?:-|/|\\s{0,3}(?:of)?\\s{0,3})` + `(${matchAnyPattern(MONTH_DICTIONARY)})` + diff --git a/test/en/en_month_name_little_endian.test.ts b/test/en/en_month_name_little_endian.test.ts index b643152a..1ae12eb1 100644 --- a/test/en/en_month_name_little_endian.test.ts +++ b/test/en/en_month_name_little_endian.test.ts @@ -461,3 +461,48 @@ test("Test - Year 3000+ support (Issue #636)", () => { expect(result.start).toBeDate(new Date(2025, 1 - 1, 1, 9, 30)); }); }); + +test("Test - Day number followed by a dot (Issue #283)", () => { + testSingleCase(chrono, "5. March 2019, 03:26 PM EDT", new Date(2019, 2, 1), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("5. March 2019, 03:26 PM EDT"); + + expect(result.start.get("year")).toBe(2019); + expect(result.start.get("month")).toBe(3); + expect(result.start.get("day")).toBe(5); + expect(result.start.get("hour")).toBe(15); + expect(result.start.get("minute")).toBe(26); + expect(result.start.get("timezoneOffset")).toBe(-240); + }); + + testSingleCase(chrono, "23. October 2026", new Date(2026, 9, 17), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("23. October 2026"); + + expect(result.start.get("year")).toBe(2026); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(23); + expect(result.start.isCertain("hour")).toBe(false); + + expect(result.start).toBeDate(new Date(2026, 10 - 1, 23, 12)); + }); + + testSingleCase(chrono, "The Deadline is 10. August", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(16); + expect(result.text).toBe("10. August"); + + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + }); + + testSingleCase(chrono, "10. - 22. August 2012", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("10. - 22. August 2012"); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + expect(result.end).toBeDate(new Date(2012, 8 - 1, 22, 12)); + }); +});