diff --git a/apps/client/src/common/utils/__tests__/dateConfig.test.js b/apps/client/src/common/utils/__tests__/dateConfig.test.js index 40b5f031d..2fe45e67b 100644 --- a/apps/client/src/common/utils/__tests__/dateConfig.test.js +++ b/apps/client/src/common/utils/__tests__/dateConfig.test.js @@ -95,20 +95,65 @@ describe('test forgivingStringToMillis()', () => { describe('handles am/pm', () => { const ampm = [ - { value: '9:10:11am', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 11 * MILLIS_PER_SECOND }, - { value: '9:10:11a', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 11 * MILLIS_PER_SECOND }, - { value: '9:10:11pm', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 11 * MILLIS_PER_SECOND }, - { value: '9:10:11p', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 11 * MILLIS_PER_SECOND }, - { value: '9:10am', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, - { value: '9:10a', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, - { value: '9:10pm', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, - { value: '9:10p', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1am', expect: 1 * MILLIS_PER_HOUR }, + { value: '1pm', expect: (12 + 1) * MILLIS_PER_HOUR }, + { value: '1 am', expect: 1 * MILLIS_PER_HOUR }, + { value: '1 pm', expect: (12 + 1) * MILLIS_PER_HOUR }, + { value: '1AM', expect: 1 * MILLIS_PER_HOUR }, + { value: '1PM', expect: (12 + 1) * MILLIS_PER_HOUR }, + { value: '9am', expect: 9 * MILLIS_PER_HOUR }, - { value: '9a', expect: 9 * MILLIS_PER_HOUR }, { value: '9pm', expect: (12 + 9) * MILLIS_PER_HOUR }, - { value: '9p', expect: (12 + 9) * MILLIS_PER_HOUR }, - { value: '12am', expect: 0 }, + + { value: '10am', expect: 10 * MILLIS_PER_HOUR }, + { value: '10pm', expect: (12 + 10) * MILLIS_PER_HOUR }, + { value: '10 am', expect: 10 * MILLIS_PER_HOUR }, + { value: '10 pm', expect: (12 + 10) * MILLIS_PER_HOUR }, + { value: '10AM', expect: 10 * MILLIS_PER_HOUR }, + { value: '10PM', expect: (12 + 10) * MILLIS_PER_HOUR }, + + { value: '12am', expect: 0 * MILLIS_PER_HOUR }, { value: '12pm', expect: 12 * MILLIS_PER_HOUR }, + + { value: '1:10am', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10pm', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10 am', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10 pm', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10AM', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10PM', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + + { value: '9:10am', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '9:10pm', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + + { value: '10:10am', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10pm', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10 am', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10 pm', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10AM', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10PM', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + + { value: '12:10am', expect: 0 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '12:10pm', expect: 12 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + + { value: '1:10:10am', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10pm', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10 am', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10 pm', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10AM', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10PM', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + + { value: '9:10:10am', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '9:10:10pm', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + + { value: '10:10:10am', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10pm', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10 am', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10 pm', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10AM', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10PM', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + + { value: '12:10:10am', expect: 0 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '12:10:10pm', expect: 12 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, ]; for (const s of ampm) { diff --git a/apps/client/src/common/utils/dateConfig.ts b/apps/client/src/common/utils/dateConfig.ts index 84a2d74d8..3e027e2da 100644 --- a/apps/client/src/common/utils/dateConfig.ts +++ b/apps/client/src/common/utils/dateConfig.ts @@ -45,7 +45,7 @@ function checkAmPm(value: string) { * @description Utility function to check if a string contain h / m / s indicators * @param {string} value */ -function checkMatchers(value: string) { +function checkMatchers(value: string): number | null { const hoursMatch = /(\d+)h/i.exec(value); const hoursMatchValue = hoursMatch ? parse(hoursMatch[1]) : 0; @@ -60,7 +60,7 @@ function checkMatchers(value: string) { hoursMatchValue * MILLIS_PER_HOUR + minutesMatchValue * MILLIS_PER_MINUTE + secondsMatchValue * MILLIS_PER_SECOND ); } - return { hoursMatchValue }; + return null; } /** @@ -85,8 +85,13 @@ function inferSeparators(value: string, isAM: boolean, isPM: boolean) { } } else if (length === 2) { if (isPM || isAM) { - inferredMillis = parse(value) * inferredMillis; - if (isAM) { + if (value === '12' && isAM) { + inferredMillis = 0; + } else { + inferredMillis = parse(value) * MILLIS_PER_HOUR; + } + + if (isAM || value === '12') { // this ensures we dont add 12 hours in the end addAM = 12; } @@ -112,43 +117,57 @@ function inferSeparators(value: string, isAM: boolean, isPM: boolean) { * @returns {number} - time string in millis */ export const forgivingStringToMillis = (value: string): number => { - if (value === '12am') { - return 0; - } + value = value.toLowerCase(); const { isAM, isPM, value: parsingValue } = checkAmPm(value); const maybeMillisFromMatchers = checkMatchers(parsingValue); - if (typeof maybeMillisFromMatchers === 'number') { + if (maybeMillisFromMatchers !== null) { return maybeMillisFromMatchers; } - let { hoursMatchValue } = maybeMillisFromMatchers; - - let millis = 0; - // split string at known separators : , . const separatorRegex = /[\s,:.]+/; const [first, second, third] = parsingValue.split(separatorRegex); + let addTwelve = isPM; + + let millis = 0; + if (first != null && second != null && third != null) { // if string has three sections, treat as [hours] [minutes] [seconds] - millis = parse(first) * MILLIS_PER_HOUR; + let hours = parse(first); + if (hours === 12) { + if (isAM) { + hours = 0; + } + addTwelve = false; + } + + millis = hours * MILLIS_PER_HOUR; millis += parse(second) * MILLIS_PER_MINUTE; millis += parse(third) * MILLIS_PER_SECOND; } else if (first != null && second == null && third == null) { // we only have one section, infer separators const { inferredMillis, addAM } = inferSeparators(first, isAM, isPM); millis = inferredMillis; - hoursMatchValue = addAM; + addTwelve = addAM < 12 && isPM; } if (first != null && second != null && third == null) { // if string has two sections, treat as [hours] [minutes] - millis = parse(first) * MILLIS_PER_HOUR; + let hours = parse(first); + if (hours === 12) { + if (isAM) { + hours = 0; + } + addTwelve = false; + } + + millis = hours * MILLIS_PER_HOUR; millis += parse(second) * MILLIS_PER_MINUTE; } - // Add 12 hours if it is PM - if (isPM && hoursMatchValue < 12) { + // Add 12 hours if needed + if (addTwelve) { millis += 12 * MILLIS_PER_HOUR; }