admin管理员组文章数量:1355591
I am making an API call that returns a large set of data. From that data I want to filter out and get only the records with a due date greater then or equal to today and less then or equal to 30 days from now.
But my filter is returning an incorrect set of records.
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
EXAMPLE of the array of Objects I am filtering through:
{
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"
}
I am noticing that the format string return a date that is one day before the date given but I'm getting results back that are months ad years before today and well after 30 days from today.
Its also return results where closedDate
is not null
I am making an API call that returns a large set of data. From that data I want to filter out and get only the records with a due date greater then or equal to today and less then or equal to 30 days from now.
But my filter is returning an incorrect set of records.
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
EXAMPLE of the array of Objects I am filtering through:
{
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"
}
I am noticing that the format string return a date that is one day before the date given but I'm getting results back that are months ad years before today and well after 30 days from today.
Its also return results where closedDate
is not null
3 Answers
Reset to default 4Please try the following solution
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)
Your problem lies within the date-format you use to do the parison.
Lets take for example this two dates:
- "10/31/2020"
- "11/30/2019"
A human can see that the date in 2020 is not smaller than the date in 2019, but for the if-parison this:
if ("10/31/2020" <= "11/30/2019")
is the same as writing:
if ("10312020" <= "11302019")
You can try this in your browser console by typing
console.log("10/31/2020" <= "11/30/2019");
You should probably use a unix timestamp for date-parison or use the y/m/d Format if you want to do a parison with strings.
OK - I wound up using a bination of both @Mario and @Christoph Kerns answers. My final solution look like this:
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);
I ultimately decided to mark @Christooph as the right answer because (1) his provided a though explanation and (2) I think the conversion to UNIX time was what really did the trick. @Mario did provide some semantics that assisted in arriving to the correct answer as well. Thank you.
本文标签: ecmascript 6Javascript filtering between dates to get records in specific date rangeStack Overflow
版权声明:本文标题:ecmascript 6 - Javascript filtering between dates to get records in specific date range - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744047130a2581736.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论