From 026baab2415aa622ea0ff19260be37638f52b015 Mon Sep 17 00:00:00 2001 From: Katherine Date: Mon, 30 Jun 2025 19:41:20 +0800 Subject: [PATCH] fix: filtering error on DateOnly or Datetime (without time zone) using Exact day variable (#7113) * fix: filtering error on DateOnly or Datetime (without time zone) fields using Exact day variable * fix: bug * fix: bug * fix: bug --- .../client/src/collection-manager/interfaces/dateOnly.ts | 1 + .../client/src/schema-component/antd/date-picker/util.ts | 4 +++- packages/core/database/src/operators/date.ts | 6 ++++-- packages/core/utils/src/date.ts | 9 +++++++-- packages/core/utils/src/parse-filter.ts | 4 +++- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/core/client/src/collection-manager/interfaces/dateOnly.ts b/packages/core/client/src/collection-manager/interfaces/dateOnly.ts index 7bc57cbb60..4e389f7511 100644 --- a/packages/core/client/src/collection-manager/interfaces/dateOnly.ts +++ b/packages/core/client/src/collection-manager/interfaces/dateOnly.ts @@ -24,6 +24,7 @@ export class DateFieldInterface extends CollectionFieldInterface { 'x-component': 'DatePicker', 'x-component-props': { dateOnly: true, + showTime: false, }, }, }; diff --git a/packages/core/client/src/schema-component/antd/date-picker/util.ts b/packages/core/client/src/schema-component/antd/date-picker/util.ts index e0d468bc31..b377c95054 100644 --- a/packages/core/client/src/schema-component/antd/date-picker/util.ts +++ b/packages/core/client/src/schema-component/antd/date-picker/util.ts @@ -10,6 +10,7 @@ import { getDefaultFormat, str2moment, toGmt, toLocal, getPickerFormat } from '@nocobase/utils/client'; import type { Dayjs } from 'dayjs'; import dayjs from 'dayjs'; +import { dayjsable, formatDayjsValue } from '@formily/antd-v5/esm/__builtins__'; const toStringByPicker = (value, picker = 'date', timezone: 'gmt' | 'local') => { if (!dayjs.isDayjs(value)) return value; @@ -89,7 +90,7 @@ export const handleDateChangeOnForm = (value, dateOnly, utc, picker, showTime, g return value; } if (dateOnly) { - return dayjs(value).startOf(picker).format('YYYY-MM-DD'); + return formatDayjsValue(value, 'YYYY-MM-DD'); } if (utc) { if (gmt) { @@ -114,6 +115,7 @@ export const mapDatePicker = function () { const { dateOnly, showTime, picker = 'date', utc, gmt, underFilter } = props; const format = getDefaultFormat(props); const onChange = props.onChange; + return { ...props, inputReadOnly: isMobileMedia, diff --git a/packages/core/database/src/operators/date.ts b/packages/core/database/src/operators/date.ts index 24b218a90a..9172e238b2 100644 --- a/packages/core/database/src/operators/date.ts +++ b/packages/core/database/src/operators/date.ts @@ -33,7 +33,7 @@ const toDate = (date, options: any = {}) => { } if (field.constructor.name === 'DateOnlyField') { - val = moment(val).format('YYYY-MM-DD HH:mm:ss'); + val = moment.utc(val).format('YYYY-MM-DD HH:mm:ss'); } const eventObj = { @@ -69,7 +69,6 @@ export default { const r = parseDate(value, { timezone: parseDateTimezone(ctx), }); - if (typeof r === 'string') { return { [Op.eq]: toDate(r, { ctx }), @@ -77,6 +76,9 @@ export default { } if (Array.isArray(r)) { + console.log(11111111, { + [Op.and]: [{ [Op.gte]: toDate(r[0], { ctx }) }, { [Op.lt]: toDate(r[1], { ctx }) }], + }); return { [Op.and]: [{ [Op.gte]: toDate(r[0], { ctx }) }, { [Op.lt]: toDate(r[1], { ctx }) }], }; diff --git a/packages/core/utils/src/date.ts b/packages/core/utils/src/date.ts index 1baf179e1f..91a083dcb1 100644 --- a/packages/core/utils/src/date.ts +++ b/packages/core/utils/src/date.ts @@ -15,6 +15,7 @@ export interface Str2momentOptions { picker?: 'year' | 'month' | 'week' | 'quarter'; utcOffset?: number; utc?: boolean; + dateOnly?: boolean; } export type Str2momentValue = string | string[] | dayjs.Dayjs | dayjs.Dayjs[]; @@ -83,10 +84,14 @@ const toMoment = (val: any, options?: Str2momentOptions) => { return; } const offset = options.utcOffset; - const { gmt, picker, utc = true } = options; + const { gmt, picker, utc = true, dateOnly } = options; + if (dayjs(val).isValid()) { + if (dateOnly) { + return dayjs.utc(val, 'YYYY-MM-DD'); + } if (!utc) { - return dayjs(val); + return dayjs.utc(val); } if (dayjs.isDayjs(val)) { diff --git a/packages/core/utils/src/parse-filter.ts b/packages/core/utils/src/parse-filter.ts index e6ec1cb978..f580b8240e 100644 --- a/packages/core/utils/src/parse-filter.ts +++ b/packages/core/utils/src/parse-filter.ts @@ -188,9 +188,11 @@ export const parseFilter = async (filter: any, opts: ParseFilterOptions = {}) => const field = getField?.(path); if (field?.constructor.name === 'DateOnlyField' || field?.constructor.name === 'DatetimeNoTzField') { + if (value.type) { + return getDayRangeByParams({ ...value, timezone: field?.timezone || timezone }); + } return value; } - return dateValueWrapper(value, field?.timezone || timezone); } return value;