首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在javascript中的日期范围之间获取数据

如何在javascript中的日期范围之间获取数据
EN

Stack Overflow用户
提问于 2021-09-17 11:41:50
回答 3查看 189关注 0票数 0

我想知道如何在javascript中获取日期范围之间的数据。

我有对象数组obj和变量sdateedate

如果cdate位于范围sdate and edate之间,如何获取数组对象

代码语言:javascript
复制
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"}
]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-17 11:55:20

在您的调度中,您将您的sdateedate与数组中单个对象中的cdate节点进行比较。这将只对字符串进行比较,因为它们都是字符串。若要执行日期比较,必须将两者转换为日期对象。您的cdate是一个标准的date对象,因此new Date()将为该字符串重新设置date对象。

但是您的sdateedate不是有效的日期字符串。因此,我拆分了它们,并使用它创建了新的date对象。比较date对象将提供预期的结果。

另外,我还把endDate的时间设置为23, 59, 59, 999。这是为了确保如果数组中的日期与结束日期具有相同的日期,则应将其过滤掉。因为这是特定日期的结束日期的最大值。

此外,您也不需要将finals.push(e)推到过滤器函数中。相反,您可以在筛选器中返回该比较的状态。这将生成一个新的数组。这将是你的预期结果。

计算两个日期之间的值的逻辑是错误的。我也纠正了这一点。

代码语言:javascript
复制
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格式并进行比较。所以过滤器语句将是

代码语言:javascript
复制
var result = obj.orders.filter(e => e.cdate >= startDate.toISOString() && e.cdate <= endDate.toISOString());
票数 2
EN

Stack Overflow用户

发布于 2021-09-17 11:53:49

你有几个问题

错误的测试之间:日期>=日期和日期<=编辑是您需要的

如果不能更改sdate、edate和对象日期,则仍然可以格式化和执行字符串操作,这比时区和夏时制所造成的日期操作更快、更安全。

代码语言:javascript
复制
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,并交换开始日期和结束日期的顺序。

代码语言:javascript
复制
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"))

票数 2
EN

Stack Overflow用户

发布于 2021-09-17 11:55:13

首先,通过使用helper函数Date以正确的格式传递字符串,可以将字符串转换为createDateObj对象,从而获得所需的结果。

然后使用过滤器并获得如下结果

代码语言:javascript
复制
return arr.filter((o) => {
    const date = new Date(o.cdate);
    return date - start > 0 && end - start > 0;
  })

代码语言:javascript
复制
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));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69222870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档