You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React DateRangePicker日期范围过滤缺失结束日期数据问题求助

日期范围过滤缺失结束日期数据问题

业务代码中filterData无法返回正确结果:当选择开始日期为7月1日、结束日期为7月5日时,filterData中缺失7月5日的数据,仅返回1日至4日的结果。

状态声明

const [startDate, setStartDate] = React.useState(new Date());
const [endDate, setEndDate] = React.useState(new Date());
const [filterList, setFilterList] = React.useState([]);

DateRangePicker组件代码

<DateRangePicker
 ranges={[selectionRange]}
 onChange={handleSelect}
 locale={enGB}
/>

原始handleSelect处理函数

const handleSelect = (date: any) => {
    const fromdate = date.selection.startDate.getTime()
    const toDate = date.selection.endDate.getTime()

    const filterData = accountLogAllDetails?.filter((itemDate: any) => (
    itemDate.dateInMilliseconds >= fromdate && itemDate.dateInMilliseconds <= toDate))
    setFilterList(filterData)
    setEndDate(date.selection.endDate)
    setStartDate(date.selection.startDate)
}

数据源示例

[
  {
    ID: 38372,
    actionType:"LOGIN",
    dateInMilliseconds:1720009655000,
    userFirstName:"Prakash",
    userId:100077,
    userLastName:"rajak",
    userLogin:"prakashRajak@gmail.com.com"
  }    
]

尝试过的解决方案(未彻底解决)

const handleSelect = (date: any) => {
    setStartDate(date.selection.startDate)
    setEndDate(date.selection.endDate)

    const fromdate = date.selection.startDate.getTime()
    const toDate = date.selection.endDate.getTime()


    const startDate1 = new Date(date.selection.endDate);
    const day = 60 * 60 * 24 * 1000;
    const endDate1 = date.selection.endDate.getTime() + day;


    const sday = date.selection.startDate.getTime()
    const eday = new Date(date.selection.endDate)
    const newDay = eday.setDate(eday.getDate() + 1);

    const filterData = accountsLog?.filter((itemDate: any) => {
        // (fromdate < itemDate.dateInMilliseconds) && (itemDate.dateInMilliseconds <= toDate) //end date is making issue
        // (itemDate.dateInMilliseconds >= fromdate) && (itemDate.dateInMilliseconds <= endDate1) //working fine but only today and yesterday is causing issue
        // const item = new Date(itemDate.dateInMilliseconds)
        return itemDate.dateInMilliseconds >= sday && itemDate.dateInMilliseconds <= newDay //only yesterday is causing issue

    })
    setFilterList(filterData)
}

问题根源

DateRangePicker返回的endDate默认是选择日期的00:00:00时间戳,而数据源中的dateInMilliseconds是当天具体时刻(比如7月5日10:00:00),这个时间戳会大于endDate的00:00:00时间戳,导致7月5日的所有记录被过滤掉。

正确解决方案

将结束时间调整为选择日期的次日00:00:00,然后用小于这个时间戳作为过滤条件,这样就能包含结束当天所有时刻的记录:

const handleSelect = (date: any) => {
    const selectedStart = date.selection.startDate;
    const selectedEnd = date.selection.endDate;

    // 处理开始时间:固定为当天00:00:00,避免因选择的startDate带具体时间漏选
    const fromTimestamp = new Date(selectedStart.getFullYear(), selectedStart.getMonth(), selectedStart.getDate()).getTime();
    // 处理结束时间:设置为次日00:00:00
    const nextDay = new Date(selectedEnd);
    nextDay.setDate(nextDay.getDate() + 1);
    const toTimestamp = new Date(nextDay.getFullYear(), nextDay.getMonth(), nextDay.getDate()).getTime();

    const filterData = accountLogAllDetails?.filter(item => 
        item.dateInMilliseconds >= fromTimestamp && item.dateInMilliseconds < toTimestamp
    );

    setFilterList(filterData);
    setStartDate(selectedStart);
    setEndDate(selectedEnd);
}

补充说明

  • 固定开始时间为当天00:00:00,避免因DateRangePicker返回的startDate包含具体时间(比如10:00:00),导致当天早于该时间的记录被漏选
  • 使用< toTimestamp而非<=,因为次日00:00:00不属于结束当天的时间范围,能准确过滤到结束当天23:59:59的所有记录

内容的提问来源于stack exchange,提问作者Prakash Rajak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:53:17