From f9afb13ceec6c8ce175af302d69d68dc5466ae7d Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Thu, 12 Dec 2024 09:50:52 +0800 Subject: [PATCH] chore: datetime parser (#5865) --- .../interfaces/datetime-interface.test.ts | 1 + .../src/__tests__/value-parsers/date.test.ts | 1 + .../src/interfaces/datetime-interface.ts | 37 +++++++++++++++++-- .../interfaces/datetime-no-tz-interface.ts | 21 +++++++++-- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/packages/core/database/src/__tests__/interfaces/datetime-interface.test.ts b/packages/core/database/src/__tests__/interfaces/datetime-interface.test.ts index 621c090e40..adcb237d4b 100644 --- a/packages/core/database/src/__tests__/interfaces/datetime-interface.test.ts +++ b/packages/core/database/src/__tests__/interfaces/datetime-interface.test.ts @@ -69,6 +69,7 @@ describe('Date time interface', () => { expect(await interfaceInstance.toValue('')).toBe(null); expect(await interfaceInstance.toValue('20231223')).toBe(dayjs('2023-12-23 00:00:00.000').toISOString()); + expect(await interfaceInstance.toValue('20231223 08:01:01')).toBe(dayjs('2023-12-23 08:01:01.000').toISOString()); expect(await interfaceInstance.toValue('2023/12/23')).toBe(dayjs('2023-12-23 00:00:00.000').toISOString()); expect(await interfaceInstance.toValue('2023-12-23')).toBe(dayjs('2023-12-23 00:00:00.000').toISOString()); expect(await interfaceInstance.toValue(42510)).toBe('2016-05-20T00:00:00.000Z'); diff --git a/packages/core/database/src/__tests__/value-parsers/date.test.ts b/packages/core/database/src/__tests__/value-parsers/date.test.ts index 5ede38c6bd..43e1262620 100644 --- a/packages/core/database/src/__tests__/value-parsers/date.test.ts +++ b/packages/core/database/src/__tests__/value-parsers/date.test.ts @@ -68,6 +68,7 @@ describe('number value parser', () => { it('should be correct', () => { expectValue('20231223').toBe(dayjs('2023-12-23 00:00:00.000').toISOString()); + expectValue('20231223 08:01:01', 'dateTime').toBe(dayjs('2023-12-23 08:01:01').toISOString()); expectValue('2023/12/23').toBe(dayjs('2023-12-23 00:00:00.000').toISOString()); expectValue('2023-12-23').toBe(dayjs('2023-12-23 00:00:00.000').toISOString()); expectValue(42510).toBe('2016-05-20T00:00:00.000Z'); diff --git a/packages/core/database/src/interfaces/datetime-interface.ts b/packages/core/database/src/interfaces/datetime-interface.ts index 85661d5933..037d2de7b9 100644 --- a/packages/core/database/src/interfaces/datetime-interface.ts +++ b/packages/core/database/src/interfaces/datetime-interface.ts @@ -31,16 +31,45 @@ function resolveTimeZoneFromCtx(ctx) { } export class DatetimeInterface extends BaseInterface { + protected parseDateString(value: string) { + const dateOnlyMatch = /^(\d{4})[-/]?(\d{2})[-/]?(\d{2})$/.exec(value); + const dateTimeMatch = /^(\d{4})(\d{2})(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(value); + + if (dateTimeMatch) { + const [_, year, month, day, hour, minute, second] = dateTimeMatch; + return { year, month, day, hour, minute, second }; + } + + if (dateOnlyMatch) { + const [_, year, month, day] = dateOnlyMatch; + return { year, month, day }; + } + + return null; + } + + protected formatDateTimeToISO(dateInfo: { + year: string; + month: string; + day: string; + hour?: string; + minute?: string; + second?: string; + }) { + const { year, month, day, hour = '00', minute = '00', second = '00' } = dateInfo; + const m = dayjs(`${year}-${month}-${day} ${hour}:${minute}:${second}.000`); + return m.toISOString(); + } + async toValue(value: any, ctx: any = {}): Promise { if (!value) { return null; } if (typeof value === 'string') { - const match = /^(\d{4})[-/]?(\d{2})[-/]?(\d{2})$/.exec(value); - if (match) { - const m = dayjs(`${match[1]}-${match[2]}-${match[3]} 00:00:00.000`); - return m.toISOString(); + const dateInfo = this.parseDateString(value); + if (dateInfo) { + return this.formatDateTimeToISO(dateInfo); } } diff --git a/packages/core/database/src/interfaces/datetime-no-tz-interface.ts b/packages/core/database/src/interfaces/datetime-no-tz-interface.ts index da585653e1..69572aaca9 100644 --- a/packages/core/database/src/interfaces/datetime-no-tz-interface.ts +++ b/packages/core/database/src/interfaces/datetime-no-tz-interface.ts @@ -14,15 +14,30 @@ function isNumeric(str: any) { } export class DatetimeNoTzInterface extends DatetimeInterface { + protected formatDateTimeToString(dateInfo: { + year: string; + month: string; + day: string; + hour?: string; + minute?: string; + second?: string; + }) { + const { year, month, day, hour, minute, second } = dateInfo; + if (hour !== undefined && minute !== undefined && second !== undefined) { + return `${year}-${month}-${day} ${hour}:${minute}:${second}`; + } + return `${year}-${month}-${day}`; + } + async toValue(value: any, ctx: any = {}): Promise { if (!value) { return null; } if (typeof value === 'string') { - const match = /^(\d{4})[-/]?(\d{2})[-/]?(\d{2})$/.exec(value); - if (match) { - return `${match[1]}-${match[2]}-${match[3]}`; + const dateInfo = this.parseDateString(value); + if (dateInfo) { + return this.formatDateTimeToString(dateInfo); } }