如何在Javascript中对Date.prototype.toLocaleString数组进行排序?

问题描述

我有一个Dates数组,其格式为Date.prototype.toLocaleString('en-GB')。如何排序这些基于字符串的日期?

示例输入:[“ 22/07/2020,8:54:09 AM”,“ 23/07/2020,9:54:09 AM”,“ 22/08/2020,8:54:09 AM “,...]

transform(list: any,columnProperty: ColumnProperties,order: string): any {
  if (!list || !columnProperty) {
    return list;
  }
  let orderVal1 = 1;
  let orderVal2 = -1;
  if (columnProperty.sortValue === DESC) {
    orderVal1 = -1;
    orderVal2 = 1;
  }
  list.sort((a,b) => {
    a = a[columnProperty.fieldName];
    b = b[columnProperty.fieldName];
    if(isNaN(a) && !isNaN(Date.parse(a)) && isNaN(b) && !isNaN(Date.parse(b))) {
      var da = new Date(a).toISOString(),db = new Date(b).toISOString();
      return da > db ? orderVal1 : ( da === db ? 0 : orderVal2 );
    }
    else {
      var va = (a === null) ? "" : "" + a,vb = (b === null) ? "" : "" + b;
    }

  return va > vb ? orderVal1 : ( va === vb ? 0 : orderVal2 );
  });
  return list;
}

预期的输出:[“ 22/07/2020,8:54:09 AM”,“ 23/07/2020,9:54:09 AM”,“ 22/08/2020,8:54:09 AM “,...]

实际输出:[“ 22/07/2020,8:54:09 AM”,“ 22/08/2020,8:54:09 AM”,“ 23/07/2020,9:54:09 AM “,...]

在这里,我使用解析来查找输入是否为日期格式,因为我可能会得到其他类型,例如字符串,数字等。 如果我的输入是UTC Date或date.toLocaleString('en-US'),则上面的代码可以很好地工作。由于格式是d / mm / yyyy,但是当我使用其他语言环境格式时,它永远无法工作。

我尝试了以下方法

  1. 试图仅出于排序目的将localeString转换回UTC,但不幸的是找不到该实用程序。
  2. 我无法对数组进行排序,因为我需要此功能是动态的。
  3. 要求是根据日期和日期在不同位置对日期进行排序。

对此表示感谢,

解决方法

通过momentjs https://momentjs.com/docs/#/parsing/string-format/解析到日期对象的语言环境日期字符串。 然后在排序函数中,将数字日期值与<>比较(a.valueOf() / b.valueOf()),而不是比较ISO字符串。