我想知道如何在javascript中获取日期范围之间的数据。
我有对象数组obj和变量sdate和edate,
如果cdate位于范围sdate and edate之间,如何获取数组对象
function getdate(){
var finals=[];
var result = obj.orders.filter(e=>{
if(e.cdate < sdate && e.cdate > edate){
finals.push(e);
}
})
}
var obj={
orders:[
{id:1, mode: "xyz", orderid: 123, cdate: "2017-2-13 07:33:30"},
{id:2, mode: "abc", orderid: 456, cdate: "2018-4-20 06:10:30"},
{id:3, mode: "xyz", orderid: 768, cdate: "2020-8-10 08:00:00"}
]
}
var sdate="11-5-2020"
var edate="20-2-2021"
Expected Output
[
{id:3, mode: "xyz", orderid: 768, cdate: "2020-8-10 08:00:00"}
]发布于 2021-09-17 11:55:20
在您的调度中,您将您的sdate和edate与数组中单个对象中的cdate节点进行比较。这将只对字符串进行比较,因为它们都是字符串。若要执行日期比较,必须将两者转换为日期对象。您的cdate是一个标准的date对象,因此new Date()将为该字符串重新设置date对象。
但是您的sdate和edate不是有效的日期字符串。因此,我拆分了它们,并使用它创建了新的date对象。比较date对象将提供预期的结果。
另外,我还把endDate的时间设置为23, 59, 59, 999。这是为了确保如果数组中的日期与结束日期具有相同的日期,则应将其过滤掉。因为这是特定日期的结束日期的最大值。
此外,您也不需要将finals.push(e)推到过滤器函数中。相反,您可以在筛选器中返回该比较的状态。这将生成一个新的数组。这将是你的预期结果。
计算两个日期之间的值的逻辑是错误的。我也纠正了这一点。
var sdate = "11-5-2020";
var edate = "20-2-2021";
var obj = {
orders: [
{ id: 1, mode: "xyz", orderid: 123, cdate: "2017-2-13 07:33:30" },
{ id: 2, mode: "abc", orderid: 456, cdate: "2018-4-20 06:10:30" },
{ id: 3, mode: "xyz", orderid: 768, cdate: "2020-8-10 08:00:00" }
]
}
function getdate() {
var finals = [];
const [sDay, sMonth, sYear] = sdate.split('-');
const [eDay, eMonth, eYear] = edate.split('-');
const startDate = new Date(sYear, +sMonth - 1, sDay);
const endDate = new Date(eYear, +eMonth - 1, eDay, 23, 59, 59, 999);
var result = obj.orders.filter(e => (new Date(e.cdate) >= startDate && new Date(e.cdate) <= endDate));
return result;
}
console.log(getdate());
请注意,如果日期是标准的格式,您可以执行字符串比较。如果您想要利用这一点,您需要将开始日期和结束日期确定为iso格式并进行比较。所以过滤器语句将是
var result = obj.orders.filter(e => e.cdate >= startDate.toISOString() && e.cdate <= endDate.toISOString());发布于 2021-09-17 11:53:49
你有几个问题
错误的测试之间:日期>=日期和日期<=编辑是您需要的
如果不能更改sdate、edate和对象日期,则仍然可以格式化和执行字符串操作,这比时区和夏时制所造成的日期操作更快、更安全。
let obj={
orders:[
{id:1, mode: "xyz", orderid: 123, cdate: "2017-2-13 07:33:30"},
{id:2, mode: "abc", orderid: 456, cdate: "2018-4-20 06:10:30"},
{id:3, mode: "xyz", orderid: 768, cdate: "2020-8-10 08:00:00"}
]
}
const getyyyymmdd = str => {
const parts = str.split(" ")[0].split("-")
return parts[0].length === 2 ? `${parts[2]}-${parts[1].padStart(2, '0')}-${parts[0].padStart(2, '0')}` : `${parts[0].padStart(2, '0')}-${parts[1].padStart(2, '0')}-${parts[2]}`
}
function getdate(sdate,edate){
sdate = getyyyymmdd(sdate)
edate = getyyyymmdd(edate)
return obj.orders.filter(({cdate}) => {
cdate = getyyyymmdd(cdate);
return cdate >= sdate && cdate <= edate
})
}
console.log(getdate("11-5-2020","20-2-2021"))
或者,如果您可以更改任何一个日期,则可以向对象添加引导0,并交换开始日期和结束日期的顺序。
let obj={
orders:[
{id:1, mode: "xyz", orderid: 123, cdate: "2017-02-13 07:33:30"},
{id:2, mode: "abc", orderid: 456, cdate: "2018-04-20 06:10:30"},
{id:3, mode: "xyz", orderid: 768, cdate: "2020-08-10 08:00:00"}
]
}
function getdate(sdate,edate){
return obj.orders.filter(item => {
return item.cdate.split(" ")[0] >= sdate && item.cdate.split(" ")[0] <= edate
})
}
console.log(getdate("2020-05-11","2021-02-20"))
发布于 2021-09-17 11:55:13
首先,通过使用helper函数Date以正确的格式传递字符串,可以将字符串转换为createDateObj对象,从而获得所需的结果。
然后使用过滤器并获得如下结果
return arr.filter((o) => {
const date = new Date(o.cdate);
return date - start > 0 && end - start > 0;
})
var sdate = "11-5-2020";
var edate = "20-2-2021";
function createDateObj(str) {
const [a, b, c] = str.split("-");
return `${b}-${a}-${c}`;
}
function getdate(arr) {
const start = new Date(createDateObj(sdate));
const end = new Date(createDateObj(edate));
return arr.filter((o) => {
const date = new Date(o.cdate);
return date - start > 0 && end - start > 0;
});
}
var obj = {
orders: [
{ id: 1, mode: "xyz", orderid: 123, cdate: "2017-2-13 07:33:30" },
{ id: 2, mode: "abc", orderid: 456, cdate: "2018-4-20 06:10:30" },
{ id: 3, mode: "xyz", orderid: 768, cdate: "2020-8-10 08:00:00" },
],
};
console.log(getdate(obj.orders));
https://stackoverflow.com/questions/69222870
复制相似问题