区间日期比较的算法:输入一个日期区间,筛选出日期在这个区间的所有数据

场景:后端以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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值