diff --git a/src/parse/_lib/constants.ts b/src/parse/_lib/constants.ts index 4fbfb67f16..ec9f8d2f51 100644 --- a/src/parse/_lib/constants.ts +++ b/src/parse/_lib/constants.ts @@ -15,6 +15,10 @@ export const numericPatterns = { threeDigits: /^\d{1,3}/, // 0 to 999 fourDigits: /^\d{1,4}/, // 0 to 9999 + exactTwoDigits: /^\d{2}/, // 00 to 99 + exactThreeDigits: /^\d{3}/, // 000 to 999 + exactFourDigits: /^\d{4}/, // 0000 to 9999 + anyDigitsSigned: /^-?\d+/, singleDigitSigned: /^-?\d/, // 0 to 9, -0 to -9 twoDigitsSigned: /^-?\d{1,2}/, // 0 to 99, -0 to -99 diff --git a/src/parse/_lib/parsers/Hour0to23Parser.ts b/src/parse/_lib/parsers/Hour0to23Parser.ts index 0a31e74e7a..50908b0ae4 100644 --- a/src/parse/_lib/parsers/Hour0to23Parser.ts +++ b/src/parse/_lib/parsers/Hour0to23Parser.ts @@ -2,7 +2,7 @@ import type { Match } from "../../../locale/types.js"; import { numericPatterns } from "../constants.js"; import { Parser } from "../Parser.js"; import type { ParseFlags, ParseResult } from "../types.js"; -import { parseNDigits, parseNumericPattern } from "../utils.js"; +import { parseNumericPattern } from "../utils.js"; export class Hour0to23Parser extends Parser { priority = 70; @@ -14,7 +14,7 @@ export class Hour0to23Parser extends Parser { case "Ho": return match.ordinalNumber(dateString, { unit: "hour" }); default: - return parseNDigits(token.length, dateString); + return parseNumericPattern(numericPatterns.exactTwoDigits, dateString); } } diff --git a/src/parse/_lib/parsers/Hour1to12Parser.ts b/src/parse/_lib/parsers/Hour1to12Parser.ts index e2e9a02b6b..f8b9188531 100644 --- a/src/parse/_lib/parsers/Hour1to12Parser.ts +++ b/src/parse/_lib/parsers/Hour1to12Parser.ts @@ -2,7 +2,7 @@ import type { Match } from "../../../locale/types.js"; import { numericPatterns } from "../constants.js"; import { Parser } from "../Parser.js"; import type { ParseFlags, ParseResult } from "../types.js"; -import { parseNDigits, parseNumericPattern } from "../utils.js"; +import { parseNumericPattern } from "../utils.js"; export class Hour1to12Parser extends Parser { priority = 70; @@ -14,7 +14,7 @@ export class Hour1to12Parser extends Parser { case "ho": return match.ordinalNumber(dateString, { unit: "hour" }); default: - return parseNDigits(token.length, dateString); + return parseNumericPattern(numericPatterns.exactTwoDigits, dateString); } } diff --git a/src/parse/_lib/parsers/MinuteParser.ts b/src/parse/_lib/parsers/MinuteParser.ts index 01d3e79e01..a068368bea 100644 --- a/src/parse/_lib/parsers/MinuteParser.ts +++ b/src/parse/_lib/parsers/MinuteParser.ts @@ -2,7 +2,7 @@ import type { Match } from "../../../locale/types.js"; import { numericPatterns } from "../constants.js"; import { Parser } from "../Parser.js"; import type { ParseFlags, ParseResult } from "../types.js"; -import { parseNDigits, parseNumericPattern } from "../utils.js"; +import { parseNumericPattern } from "../utils.js"; export class MinuteParser extends Parser { priority = 60; @@ -14,7 +14,7 @@ export class MinuteParser extends Parser { case "mo": return match.ordinalNumber(dateString, { unit: "minute" }); default: - return parseNDigits(token.length, dateString); + return parseNumericPattern(numericPatterns.exactTwoDigits, dateString); } } diff --git a/src/parse/_lib/parsers/SecondParser.ts b/src/parse/_lib/parsers/SecondParser.ts index 51c8f82f61..82d90f5ba0 100644 --- a/src/parse/_lib/parsers/SecondParser.ts +++ b/src/parse/_lib/parsers/SecondParser.ts @@ -2,7 +2,7 @@ import type { Match } from "../../../locale/types.js"; import { numericPatterns } from "../constants.js"; import { Parser } from "../Parser.js"; import type { ParseFlags, ParseResult } from "../types.js"; -import { parseNDigits, parseNumericPattern } from "../utils.js"; +import { parseNumericPattern } from "../utils.js"; export class SecondParser extends Parser { priority = 50; @@ -14,7 +14,7 @@ export class SecondParser extends Parser { case "so": return match.ordinalNumber(dateString, { unit: "second" }); default: - return parseNDigits(token.length, dateString); + return parseNumericPattern(numericPatterns.exactTwoDigits, dateString); } } diff --git a/src/parse/test.ts b/src/parse/test.ts index 12800656b6..bc462413f2 100644 --- a/src/parse/test.ts +++ b/src/parse/test.ts @@ -2259,6 +2259,13 @@ describe("parse", () => { expect(result instanceof Date && isNaN(result.getTime())).toBe(true); }); + it("H, h, m, s parsers returns Invalid Date if the digits of `formatString` does not match exactly that of the `datestring`", () => { + ["HH", "hh", "mm", "ss"].forEach((token) => { + const result = parse("1", token, referenceDate); + assert(result instanceof Date && isNaN(result.getTime())); + }); + }); + it("parses normally if the remaining input is just whitespace", () => { const result = parse("2016-11-05 \n", "yyyy-MM-dd", referenceDate); expect(result).toEqual(new Date(2016, 10 /* Nov */, 5));