mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 21:49:25 +08:00
chore: datetime parser (#5865)
This commit is contained in:
parent
5808543ebc
commit
f9afb13cee
@ -69,6 +69,7 @@ describe('Date time interface', () => {
|
|||||||
expect(await interfaceInstance.toValue('')).toBe(null);
|
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')).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('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');
|
expect(await interfaceInstance.toValue(42510)).toBe('2016-05-20T00:00:00.000Z');
|
||||||
|
@ -68,6 +68,7 @@ describe('number value parser', () => {
|
|||||||
|
|
||||||
it('should be correct', () => {
|
it('should be correct', () => {
|
||||||
expectValue('20231223').toBe(dayjs('2023-12-23 00:00:00.000').toISOString());
|
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('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');
|
expectValue(42510).toBe('2016-05-20T00:00:00.000Z');
|
||||||
|
@ -31,16 +31,45 @@ function resolveTimeZoneFromCtx(ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class DatetimeInterface extends BaseInterface {
|
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> {
|
async toValue(value: any, ctx: any = {}): Promise<any> {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof value === 'string') {
|
if (typeof value === 'string') {
|
||||||
const match = /^(\d{4})[-/]?(\d{2})[-/]?(\d{2})$/.exec(value);
|
const dateInfo = this.parseDateString(value);
|
||||||
if (match) {
|
if (dateInfo) {
|
||||||
const m = dayjs(`${match[1]}-${match[2]}-${match[3]} 00:00:00.000`);
|
return this.formatDateTimeToISO(dateInfo);
|
||||||
return m.toISOString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,15 +14,30 @@ function isNumeric(str: any) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class DatetimeNoTzInterface extends DatetimeInterface {
|
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> {
|
async toValue(value: any, ctx: any = {}): Promise<any> {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof value === 'string') {
|
if (typeof value === 'string') {
|
||||||
const match = /^(\d{4})[-/]?(\d{2})[-/]?(\d{2})$/.exec(value);
|
const dateInfo = this.parseDateString(value);
|
||||||
if (match) {
|
if (dateInfo) {
|
||||||
return `${match[1]}-${match[2]}-${match[3]}`;
|
return this.formatDateTimeToString(dateInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user