当我在开始日期和结束日期中选择相同的日期时,我的日期过滤器不会显示结果.如何修复



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

我需要在开始日期前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;
}
}

将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以毫秒为单位。

  1. 以日期时间类型的形式存储您的日期"2020-12-30 09:37:00";(例如,mySql日期时间总是以UTC毫秒为单位(
  2. 每次你想从数据库中检索日期时间,你都会得到它的毫秒等效值";2020-12-30 09:40:00"=自epoch以来1609314000000毫秒
  3. 当要比较日期时间时——即使是找到相同的日期范围——你也不会有问题,因为比较将以整数精度进行

当然,上述内容可以根据您所在国家/地区的日期时间偏移量进行更改。

数据结构和逻辑示例:

//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...

比较两个长整数比为新的Date((对象赋值更节省空间。

  • 1个长整数=4字节的变量
  • 1 Date((对象,根据java.util.Date=32字节(对象内存计算(

我希望为您的案例指明不同的方法!

我认为在过滤器管道内部,日期对象的比较方式是造成问题的原因。与其像这样进行比较,平等很可能不起作用:

新日期(用户["dob"](>=新日期(过滤器[key](

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

最新更新