From 1459655b90b9fef7522a9296a20bb2823f1e5dfe Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Mon, 26 Aug 2024 12:59:03 -0600 Subject: [PATCH] handling am/pm --- .../src/models/local/tests/timeUtils.test.ts | 1 - nextjs/src/models/local/timeUtils.ts | 49 ++++++++++++------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/nextjs/src/models/local/tests/timeUtils.test.ts b/nextjs/src/models/local/tests/timeUtils.test.ts index cf43df8..2582c0c 100644 --- a/nextjs/src/models/local/tests/timeUtils.test.ts +++ b/nextjs/src/models/local/tests/timeUtils.test.ts @@ -14,6 +14,5 @@ describe("Can properly handle expected date formats", () => { const dateString = "8/27/2024 23:95:00" const dateObject = getDateFromString(dateString) expect(dateObject).not.toBeUndefined() - }) }) \ No newline at end of file diff --git a/nextjs/src/models/local/timeUtils.ts b/nextjs/src/models/local/timeUtils.ts index c3774b7..a161bdf 100644 --- a/nextjs/src/models/local/timeUtils.ts +++ b/nextjs/src/models/local/timeUtils.ts @@ -1,39 +1,52 @@ - -export const getDateFromString = (value: string) => { - // Updated regex to match both formats: "MM/DD/YYYY HH:mm:ss" and "M/D/YYYY h:mm:ss AM/PM" - const validDateRegex = /^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}:\d{2}(?:\s?[APap][Mm])?$/; - if (!validDateRegex.test(value)) { - console.log("invalid date format", value); - return undefined; - } - - const [datePart, timePartWithMeridian] = value.split(" "); +const _getDateFromAMPM = (datePart: string, timePartWithMeridian: string): Date | undefined => { const [day, month, year] = datePart.split("/").map(Number); - let [timePart, meridian] = timePartWithMeridian.split(" "); + const [timePart, meridian] = timePartWithMeridian.split(" "); const [hours, minutes, seconds] = timePart.split(":").map(Number); let adjustedHours = hours; if (meridian) { - meridian = meridian.toUpperCase(); - if (meridian === "PM" && hours < 12) { + const upperMeridian = meridian.toUpperCase(); + if (upperMeridian === "PM" && hours < 12) { adjustedHours += 12; - } else if (meridian === "AM" && hours === 12) { + } else if (upperMeridian === "AM" && hours === 12) { adjustedHours = 0; } } const date = new Date(year, month - 1, day, adjustedHours, minutes, seconds); + return isNaN(date.getTime()) ? undefined : date; +}; - if (isNaN(date.getTime())) { - console.log("could not parse time out of value", value); - +const _getDateFromMilitary = (datePart: string, timePart: string): Date | undefined => { + const [day, month, year] = datePart.split("/").map(Number); + const [hours, minutes, seconds] = timePart.split(":").map(Number); + + const date = new Date(year, month - 1, day, hours, minutes, seconds); + return isNaN(date.getTime()) ? undefined : date; +}; + +export const getDateFromString = (value: string): Date | undefined => { + // Regex for AM/PM format: "M/D/YYYY h:mm:ss AM/PM" + const ampmDateRegex = /^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}:\d{2}\s{1}[APap][Mm]$/; + + // Regex for military time format: "MM/DD/YYYY HH:mm:ss" + const militaryDateRegex = /^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}:\d{2}$/; + + if (ampmDateRegex.test(value)) { + const [datePart, timePartWithMeridian] = value.split(/[\s\u202F]+/); + return _getDateFromAMPM(datePart, timePartWithMeridian); + } else if (militaryDateRegex.test(value)) { + const [datePart, timePart] = value.split(" "); + return _getDateFromMilitary(datePart, timePart); + } else { + console.log("invalid date format", value); return undefined; } - return date; }; + export const verifyDateStringOrUndefined = ( value: string ): string | undefined => {