繁体   English   中英

Javascript 在日期之间过滤以获取特定日期范围内的记录

[英]Javascript filtering between dates to get records in specific date range

我正在进行一个返回大量数据的 API 调用。 从该数据中,我想过滤掉并仅获取到期日期大于或等于今天且小于或等于从现在起 30 天的记录。

但是我的过滤器返回了一组不正确的记录。

addDays = (date, days) => {
        var result = new Date(date);
        result.setDate(result.getDate() + days);
        return result;
    }

let today = new Intl.DateTimeFormat('en-US').format(new Date()); //returns "07/31/2020" as expected
let add30 = new Intl.DateTimeFormat('en-US').format(this.addDays(today, 30)); //returns "08/30/2020 as expected

let dueInThirtyDays = allActivities.filter(activity => new Intl.DateTimeFormat('en-US').format(new Date(activity.dueDate)) >= today && new Intl.DateTimeFormat('en-US').format(new Date(activity.dueDate)) <= add30 && new Intl.DateTimeFormat('en-US').format(new Date(activity.closedDate) === null));


//where format of activity.dueDate = "2020-01-14" which is whay its wrapped in the DateTimeFormat method

我正在过滤的对象数组的示例:

{
typeCode: "BCA "
categoryCode: "PN "
activityDescription: "PNACT03 TIER2 PRIMARY"
effectiveDate: "2010-10-14"
statusDate(pin): null
closedDate(pin): "2012-06-30"
dueDate(pin): "2011-01-14"
}

我注意到格式字符串返回的日期是给定日期前一天的日期,但我得到的结果是今天之前的几个月广告和今天之后的 30 天。 它还返回关闭日期不是closedDate的结果

请尝试以下解决方案

 const data = [ { typeCode: "BCA ", categoryCode: "PN ", activityDescription: "PNACT03 TIER2 PRIMARY", effectiveDate: "2010-10-14", 'statusDate(pin)': null, 'closedDate(pin)': "2012-06-30", 'dueDate(pin)': "2011-01-14", }, { typeCode: "VGA ", categoryCode: "PN ", activityDescription: "PNACT03 TIER2 PRIMARY", effectiveDate: "2010-10-14", 'statusDate(pin)': null, 'closedDate(pin)': "2012-06-30", 'dueDate(pin)': "2011-01-14", }, { typeCode: "ABC ", categoryCode: "PN ", activityDescription: "PNACT03 TIER2 PRIMARY", effectiveDate: "2010-10-14", 'statusDate(pin)': null, 'closedDate(pin)': "2012-06-30", 'dueDate(pin)': "2020-08-14", } ] const from = Date.now() const until = new Date().setDate(new Date().getDate() + 30) const output = data.filter(entry => { const time = new Date(entry['dueDate(pin)']).getTime() return time >= from && time <= until }) console.log(output)

您的问题在于您用于进行比较的日期格式。

让我们以这两个日期为例:

  1. “2020 年 10 月 31 日”
  2. “2019 年 11 月 30 日”

人类可以看到 2020 年的日期不小于 2019 年的日期,但是对于 if-comparison,这是:

if ("10/31/2020" <= "11/30/2019")

和写法一样:

if ("10312020" <= "11302019")

您可以在浏览器控制台中输入

console.log("10/31/2020" <= "11/30/2019");

您可能应该使用 unix 时间戳进行日期比较,或者如果您想与字符串进行比较,请使用 y/m/d 格式。

好的-我最终使用了@Mario 和@Christoph Kerns 答案的组合。 我的最终解决方案如下所示:

const fromUnix = new Date().getTime() / 1000;
const untilUnix = new Date().setDate(new Date().getDate() + 30)/ 1000;
let dueInThirtyDays = this.props.activities.allActivities.filter(activity =>(new Date(activity.dueDate).getTime() / 1000) >= fromUnix &&  (new Date(activity.dueDate).getTime() / 1000) <= untilUnix);

我最终决定将@Christooph 标记为正确答案,因为(1)他提供了一个虽然解释,(2)我认为转换为 UNIX 时间才是真正的诀窍。 @Mario 确实提供了一些有助于得出正确答案的语义。 谢谢你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM