如何在角度 4 材料排序中对日期/时间列进行排序?

Posted

技术标签:

【中文标题】如何在角度 4 材料排序中对日期/时间列进行排序?【英文标题】:How to sort Date/Time column in angular 4 material sort? 【发布时间】:2018-05-10 11:00:26 【问题描述】:

我正在使用角度材料表并使用 matSort 进行排序。但它不是对日期/时间列进行排序。它将日期时间列值作为字符串。

如何对 Angular 4 材料中的日期/时间列进行排序?

我的 json 看起来像这样

 
        "name": "Rule Test 5",
        "time": "2017-11-17T08:34:32",
        "version": 1,
        "status": "SAVED"
    , 
        "name": "Availability Adjustment",
        "time": "2017-11-17T10:13:27",
        "version": 1,
        "status": "SAVED"
    , 
        "name": "Class suppression",
        "time": "2017-11-17T11:18:44",
        "version": 1,
        "status": "SAVED"
    

我的桌子是这样的

-------------------------------
name | version | status | date |
-------------------------------
...
..
..
--------------------------------

【问题讨论】:

请在此 pluner (plnkr.co/edit/z1BmTxFWAEvWQuMIAXCv?p=preview) 上复制并解释您的问题,我会尽力提供帮助 【参考方案1】:

这里是解决方案:

this.dataSource.sortingDataAccessor = (item, property): string | number => 
  switch (property) 
    case 'fromDate': return new Date(item.fromDate).toNumber();
    default: return item[property];
  
;

MatTableDataSource 有sortingDataAccessor,我们可以根据需要自定义。

【讨论】:

【参考方案2】:

使用最新版本的 Angular Material 5,您应该只添加一个属性“mat-sort-header”,它就会开箱即用。此外,您可以添加一些 DatePipe 以便格式化该 Date 对象。

<mat-table>
  <ng-container matColumnDef="fromDate">
    <mat-header-cell *matHeaderCellDef mat-sort-header> 
       <span translate>date</span>
    </mat-header-cell>
    <mat-cell *matCellDef="let row"> 
       row.fromDate | date: 'dd MMM., yyyy, HH:mm' 
    </mat-cell>
  </ng-container>
</mat-table>

我也认为 Andriy 已经帮助了这个 plnkr (plnkr.co/edit/z1BmTxFWAEvWQuMIAXCv?p=preview)

【讨论】:

【参考方案3】:

除了 Sagar Kharche 的帖子,如果您的日期来自 firebase,我建议您这样做:

this.dataSource.sortingDataAccessor = (item, property) => 
    console.log(item)
    switch (property) 
      case 'fromDate': 
        return new Date(item.fromDate.seconds * 1000);
      
      default: return item[property];
    
  ;

【讨论】:

【参考方案4】:

扩展 Sagar Kharche 的回答,如果您使用材料文档中的排序功能并使用 moment.js 作为日期,这种方式也可以。

sortData(data: Job[]): Job[] 
if (!this.sort.active || this.sort.direction === '')  return data; 

return data.sort((a, b) => 
  let propertyA: number | Date | string = '';
  let propertyB: number | Date | string = '';

  switch (this.jobSort.active) 
    case 'status': [propertyA, propertyB] = [a.status, b.status]; break;
    case 'type': [propertyA, propertyB] = [a.type, b.type]; break;
    case 'time': [propertyA, propertyB] = [new Date(moment(a.time, 'MMM Do LT').toDate()),
    new Date(moment(b.time, 'MMM Do LT').toDate())]; break;
  

  const valueA = isNaN(+propertyA) ? propertyA : +propertyA;
  const valueB = isNaN(+propertyB) ? propertyB : +propertyB;

  return (valueA < valueB ? -1 : 1) * (this.jobSort.direction === 'asc' ? 1 : -1);
);

【讨论】:

【参考方案5】:

在材料表中按日期排序的最简单方法是将日期转换为 sortingDateAccessor 中的 Unix 时间戳

this.dataSource.sortingDataAccessor = (item, property) => 
        switch (property) 
            case 'birthday':
                return new Date(item.birthday).getTime()

            default:
                return item[property]
        

【讨论】:

以上是关于如何在角度 4 材料排序中对日期/时间列进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中按日期列排序的组中对列进行排名

如果使用格式化程序进行显示,如何在 bootstrap-vue 中对日期列进行排序?

使用动态列排序 - 角度材料

如何在 PHP 中对日期数组进行排序

如何根据添加到画廊的日期在 Swift 中对照片进行排序

如何在 RecyclerView 中对字符串元素进行排序?