Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我在开始日期和结束日期中选择相同的日期时,我的日期筛选器不显示结果。如何修复它?_Javascript_Angular_Typescript_Datetime_Filter - Fatal编程技术网

Javascript 当我在开始日期和结束日期中选择相同的日期时,我的日期筛选器不显示结果。如何修复它?

Javascript 当我在开始日期和结束日期中选择相同的日期时,我的日期筛选器不显示结果。如何修复它?,javascript,angular,typescript,datetime,filter,Javascript,Angular,Typescript,Datetime,Filter,我正在使用一个定制的过滤管。当我在开始日期和结束日期中选择相同的日期时,它不会显示结果,尽管记录可用于该日期 我需要在开始日期之前或之前输入1天以查看结果。请建议我需要在过滤器中进行哪些更改 import { Pipe, PipeTransform } from "@angular/core"; @Pipe({ name: "tableFilter" }) export class TableFilterPipe implements PipeTr

我正在使用一个定制的过滤管。当我在开始日期和结束日期中选择相同的日期时,它不会显示结果,尽管记录可用于该日期

我需要在开始日期之前或之前输入1天以查看结果。请建议我需要在过滤器中进行哪些更改

import { Pipe, PipeTransform } from "@angular/core";

@Pipe({
  name: "tableFilter"
})

export class TableFilterPipe implements PipeTransform {
  transform(list: any[], filters: any) {
    const keys = Object.keys(filters).filter(key => filters[key]);
    const filterUser = (user: { [x: string]: any; }) =>
      keys.every(key => {
        if (key == "sdob") {
          return new Date(user["dob"]) >= new Date(filters[key]);
        } else if (key == "edob") {
          return new Date(filters[key]) >= new Date(user["dob"]);
        } else {
          return user[key] === filters[key];
        }
      });
    return keys.length ? list.filter(filterUser) : list;
  }
}

我认为在过滤管内部,比较日期对象的方式导致了问题。而不是像这样进行比较,在这种情况下,相等者很可能不起作用:

新日期(用户[“dob”])>=新日期(过滤器[键])

您可以对日期对象使用“getTime()”方法并进行比较。或者使用此线程中显示的其他方法:

将TableFilterPipe更改为此并检查

if (key == "sdob") {
     return new Date(user["dob"]) >= new Date(new Date(filters[key]).setHours(0,0,0,0));
} else if (key == "edob") {
     return new Date(new Date(filters[key]).setHours(0,0,0,0)) >= new Date(user["dob"]);
}

在使用Date()计算或操纵时,一种非常好的方法是毫秒。因此,对日期过滤器的新更新可能是计算日期时间而不是日期

对于很多人来说,在处理日期范围时会感到困惑。让我举个例子:一些国家对00:00:00到24:00:00的解释在逻辑上是相同的,但在可用性方面是完全不同的

想象一下,你的网站上有一场比赛,参赛者必须在特定的全球时间之前参赛!。。。日期和时间都很重要!UTC以毫秒为单位

  • 以日期时间类型的形式存储日期。“2020-12-30 09:37:00”(例如,mySql日期时间总是以毫秒UTC为单位)
  • 每次您想要从DB中检索datetime时,您都会得到它的毫秒等效值“2020-12-30 09:40:00”=1609314000000毫秒(自epoch以来)
  • 在比较日期时间时,即使是找到相同的日期范围,也不会有问题,因为比较将以整数精度进行
  • 当然,可以修改以上内容以满足您所在国家的日期时间偏移

    数据结构和逻辑示例:

    //dataset or Jason retrieved from your database
    let dataset =[{user:'a',datetime:1609314000000},{user:'b',datetime:1609314000000}]
    
    // When its time to compare inside your filter
    // First find your record and extract its datetime
        let foundUser = dataset.filter(obj => obj.user === 'b');
        console.log(foundValue[0].datetime) // result: 1609314000000
    
    // Now you can do whatever you want with any logic operator, >=, <=, == etc...
    
    //从数据库中检索数据集或Jason
    让dataset=[{user:'a',datetime:1609314000000},{user:'b',datetime:1609314000000}]
    //什么时候该在过滤器内进行比较
    //首先找到您的记录并提取其日期时间
    让foundUser=dataset.filter(obj=>obj.user=='b');
    console.log(foundValue[0].datetime)//结果:1609314000000
    
    //现在,您可以使用任何逻辑运算符>=,做任何您想做的事情,您能为我的代码提供一个可重用的解决方案吗