From 7577cdd2a27bb09af76b79b5bfa8ade966295968 Mon Sep 17 00:00:00 2001 From: b84330808 Date: Sat, 24 Oct 2026 13:10:49 +0900 Subject: [PATCH] fix(zh): parse three-character Chinese numeral days in zh.hant dates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The zh.hant date parser only accepted one or two Chinese numerals for the day, so days such as 二十四 or 三十一 were cut short: "十月二十四日" was read as October 20 and "十二月三十一號" as December 30. Allow up to three numerals, as the zh.hans parser already does. Co-Authored-By: Claude Opus 5.5 --- .../zh/hant/parsers/ZHHantDateParser.ts | 2 +- test/zh/hant/zh_hant_date.test.ts | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/locales/zh/hant/parsers/ZHHantDateParser.ts b/src/locales/zh/hant/parsers/ZHHantDateParser.ts index 5f078544..7bce71f2 100644 --- a/src/locales/zh/hant/parsers/ZHHantDateParser.ts +++ b/src/locales/zh/hant/parsers/ZHHantDateParser.ts @@ -34,7 +34,7 @@ export default class ZHHantDateParser extends AbstractParserWithWordBoundaryChec "(?:\\s*)" + "(" + "\\d{1,2}|" + - "[" + Object.keys(NUMBER).join("") + "]{1,2}" + + "[" + Object.keys(NUMBER).join("") + "]{1,3}" + ")?" + "(?:\\s*)" + "(?:日|號)?" diff --git a/test/zh/hant/zh_hant_date.test.ts b/test/zh/hant/zh_hant_date.test.ts index 78e55495..c4b96575 100644 --- a/test/zh/hant/zh_hant_date.test.ts +++ b/test/zh/hant/zh_hant_date.test.ts @@ -154,3 +154,33 @@ test("Test - Date expression at the beginning of the text", function () { expect(result.start.get("day")).toBe(10); }); }); + +test("Test - Date expression with a three-character Chinese numeral day", function () { + testSingleCase(chrono.zh.hant, "十月二十四日", new Date(2012, 8 - 1, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("十月二十四日"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(24); + + const resultDate = result.start.date(); + const expectDate = new Date(2012, 10 - 1, 24, 12); + expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime()); + }); + + testSingleCase(chrono.zh.hant, "雞二零一六年十二月三十一號全部都係雞", new Date(2012, 8 - 1, 10), (result) => { + expect(result.index).toBe(1); + expect(result.text).toBe("二零一六年十二月三十一號"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(12); + expect(result.start.get("day")).toBe(31); + + const resultDate = result.start.date(); + const expectDate = new Date(2016, 12 - 1, 31, 12); + expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime()); + }); +});