场景:后端以string类型返回日期,格式为YYYY/MM-YYYY/MM。存在的值有:-(当日期为空时),YYYY/MM,或者YYYY/MM-YYYY/MM区间型。如图一。如果是YYYY/MM型被认为是开始时间。
要求:通过图二输入框进行筛选。输入框可输入开始时间和结束时间,也可以为空,但是结束时间要大于开始时间,否则输入框校验不通过。
所得结果:后台返回的值(也就是表格里面的值)不论是YYYY/MM型还是YYYY/MM-YYYY/MM型,有一个值在所输入的时间范围内即算符合筛选的条件。
import dayjs from 'dayjs';
import moment from 'moment';
export namespace DateUtils {
export const formatDate = (
date: Date | string | null | undefined,
pattern: string,
blankString?: string
): string | undefined => {
try {
return date
? date === '00000000' || date === '99999999'
? blankString
: dayjs(date).format(pattern)
: blankString;
} catch (err) {
return date as string;
}
};
export const dateIsValid = (value?: string | Date | null) => {
return value ? moment(value).isValid() : false;
};
}
const result = [
{rentalUpdateDate:'-'},
{rentalUpdateDate:'2021/05'},
{rentalUpdateDate:'2020/05-2021/02'},
{rentalUpdateDate:'2022/11'}
]
// params.rentalUpdateDateStart 是input 输入的开始时间
// params.rentalUpdateDateEnd 是input 输入的结束时间
// inputStart format 之后的input 输入的开始时间
// inputEnd format 之后的input 输入的结束时间
// from 需要筛选的数据的开始时间
// to 需要筛选的数据的结束时间
const inputStart = DateUtils.dateIsValid(params.rentalUpdateDateStart)
? DateUtils.formatDate(params.rentalUpdateDateStart, 'YYYYMM')
: null;
const inputEnd = DateUtils.dateIsValid(params.rentalUpdateDateEnd)
? DateUtils.formatDate(params.rentalUpdateDateEnd, 'YYYYMM')
: null;
const filerResult = result?.filter((row: any) => {
const dataArray = row.rentalUpdateDate?.split('-');
const from =
dataArray?.length > 0 && DateUtils.dateIsValid(dataArray[0])
? DateUtils.formatDate(dataArray[0], 'YYYYMM')
: null;
const to =
dataArray?.length > 1 && DateUtils.dateIsValid(dataArray[1])
? DateUtils.formatDate(dataArray[1], 'YYYYMM')
: null;
if (
from &&
(!inputStart || from >= inputStart) &&
(!inputEnd || from <= inputEnd)
) {
return true;
} else if (
to &&
(!inputStart || to >= inputStart) &&
(!inputEnd || to <= inputEnd)
) {
return true;
} else {
return false;
}
});
另外: moment.js和Day.js插件中有isBetween、isBefore、isAfter这样的方法,判断条件中大小的判断也可以用这些方法
测试结果:
inputStart 202101 inputEnd null
from null to null
是否在区间内 false
from 202105 to null
是否在区间内 true
from 202005 to 202102
是否在区间内 true
from 202211 to null
是否在区间内 true
inputStart null inputEnd 202301
from null to null
是否在区间内 false
from 202105 to null
是否在区间内 true
from 202005 to 202102
是否在区间内 true
from 202211 to null
是否在区间内 true
inputStart 202106 inputEnd 202201
from null to null
是否在区间内 false
from 202105 to null
是否在区间内 false
from 202005 to 202102
是否在区间内 false
from 202211 to null
是否在区间内 false
inputStart 202104 inputEnd 202206
from null to null
是否在区间内 false
from 202105 to null
是否在区间内 true
from 202005 to 202102
是否在区间内 false
from 202211 to null
是否在区间内 false
inputStart 202004 inputEnd 202103
from null to null
是否在区间内 false
from 202105 to null
是否在区间内 false
from 202005 to 202102
是否在区间内 true
from 202211 to null
是否在区间内 false
inputStart 202006 inputEnd 202103
from null to null
是否在区间内 false
from 202105 to null
是否在区间内 false
from 202005 to 202102
是否在区间内 true
from 202211 to null
是否在区间内 false