diff --git a/src/common/parsers/ISOFormatParser.ts b/src/common/parsers/ISOFormatParser.ts index e1ef0dcd..fedb778d 100644 --- a/src/common/parsers/ISOFormatParser.ts +++ b/src/common/parsers/ISOFormatParser.ts @@ -16,7 +16,7 @@ const PATTERN = new RegExp( "(?:T" + //.. "([0-9]{1,2}):([0-9]{1,2})" + // hh:mm "(?:" + - ":([0-9]{1,2})(?:\\.(\\d{1,4}))?" + + ":([0-9]{1,2})(?:\\.(\\d+))?" + ")?" + // :ss.s "(" + "Z|([+-]\\d{2}):?(\\d{2})?" + @@ -57,7 +57,7 @@ export default class ISOFormatParser extends AbstractParserWithWordBoundaryCheck } if (match[MILLISECOND_NUMBER_GROUP] != null) { - components.assign("millisecond", parseInt(match[MILLISECOND_NUMBER_GROUP])); + components.assign("millisecond", parseInt(match[MILLISECOND_NUMBER_GROUP].padEnd(3, "0").slice(0, 3))); } if (match[TZD_GROUP] != null) { // The Zulu time zone (Z) is equivalent to UTC diff --git a/test/en/en_inter_std.test.ts b/test/en/en_inter_std.test.ts index 7200487e..70b4eb9a 100644 --- a/test/en/en_inter_std.test.ts +++ b/test/en/en_inter_std.test.ts @@ -116,3 +116,33 @@ test("Test - Single Expression with local timezeon", function () { expect(result.start).toBeDate(new Date("2015-07-31T12:00:00")); }); }); + +test("Test - ISO 8601 with 6 fractional-second digits and a positive offset", function () { + testSingleCase(chrono, "2024-03-10T10:00:00.123456+05:30", new Date(2012, 7, 8), (result) => { + expect(result.text).toBe("2024-03-10T10:00:00.123456+05:30"); + expect(result.start.get("second")).toBe(0); + expect(result.start.get("millisecond")).toBe(123); + expect(result.start.isCertain("timezoneOffset")).toBe(true); + expect(result.start).toBeDate(new Date("2024-03-10T04:30:00.123Z")); + }); +}); + +test("Test - ISO 8601 with 5 fractional-second digits and a negative offset", function () { + testSingleCase(chrono, "2024-03-10T10:00:00.12345-05:00", new Date(2012, 7, 8), (result) => { + expect(result.text).toBe("2024-03-10T10:00:00.12345-05:00"); + expect(result.start.get("second")).toBe(0); + expect(result.start.get("millisecond")).toBe(123); + expect(result.start.isCertain("timezoneOffset")).toBe(true); + expect(result.start).toBeDate(new Date("2024-03-10T15:00:00.123Z")); + }); +}); + +test("Test - ISO 8601 with 9 fractional-second digits and Z", function () { + testSingleCase(chrono, "2024-03-10T10:00:00.123456789Z", new Date(2012, 7, 8), (result) => { + expect(result.text).toBe("2024-03-10T10:00:00.123456789Z"); + expect(result.start.get("second")).toBe(0); + expect(result.start.get("millisecond")).toBe(123); + expect(result.start.isCertain("timezoneOffset")).toBe(true); + expect(result.start).toBeDate(new Date("2024-03-10T10:00:00.123Z")); + }); +});