diff --git a/src/calculation/mergingCalculation.ts b/src/calculation/mergingCalculation.ts index 033a4f9c..8907c459 100644 --- a/src/calculation/mergingCalculation.ts +++ b/src/calculation/mergingCalculation.ts @@ -1,5 +1,6 @@ import { ParsingComponents, ParsingResult } from "../results"; import { Meridiem } from "../index"; +import { assignSimilarDate, implySimilarDate } from "../utils/dayjs"; export function mergeDateTimeResult(dateResult: ParsingResult, timeResult: ParsingResult): ParsingResult { const result = dateResult.clone(); @@ -13,11 +14,13 @@ export function mergeDateTimeResult(dateResult: ParsingResult, timeResult: Parsi const endDateTime = mergeDateTimeComponent(endDate, endTime); if (dateResult.end == null && endDateTime.date().getTime() < result.start.date().getTime()) { - // Ex. 9pm - 1am + // For example, "Tuesday 9pm - 1am" the ending should actually be 1am on the next day. + // We need to add to ending by another day. + const nextDayJs = endDateTime.dayjs().add(1, "day"); if (endDateTime.isCertain("day")) { - endDateTime.assign("day", endDateTime.get("day") + 1); + assignSimilarDate(endDateTime, nextDayJs); } else { - endDateTime.imply("day", endDateTime.get("day") + 1); + implySimilarDate(endDateTime, nextDayJs); } } diff --git a/test/en/en_time_exp.test.ts b/test/en/en_time_exp.test.ts index c5c559a8..b0318a8e 100644 --- a/test/en/en_time_exp.test.ts +++ b/test/en/en_time_exp.test.ts @@ -270,6 +270,24 @@ test("Test - Time range's meridiem handling", function () { }); }); +test("Test - Time range to the next day", () => { + testSingleCase(chrono, "December 31, 2022 10:00 pm - 1:00 am", new Date(2017, 7 - 1, 7), (result) => { + expect(result.start.get("day")).toBe(31); + expect(result.start.get("month")).toBe(12); + expect(result.start.get("year")).toBe(2022); + expect(result.start.get("hour")).toBe(22); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); + + testSingleCase(chrono, "December 31, 2022 10:00 pm - 12:00 am", new Date(2017, 7 - 1, 7), (result) => { + expect(result.start.get("day")).toBe(31); + expect(result.start.get("month")).toBe(12); + expect(result.start.get("year")).toBe(2022); + expect(result.start.get("hour")).toBe(22); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); +}); + test("Test - Parsing causal positive cases", function () { testSingleCase(chrono.casual, "at 1", (result) => { expect(result.text).toBe("at 1");