chore: datetime parser (#5865)

This commit is contained in:
ChengLei Shao 2024-12-12 09:50:52 +08:00 committed by GitHub
parent 5808543ebc
commit f9afb13cee
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 53 additions and 7 deletions

View File

@ -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');

View File

@ -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');

View File

@ -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<any> {
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);
}
}

View File

@ -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<any> {
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);
}
}