问题描述
我有一个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,但是当我使用其他语言环境格式时,它永远无法工作。
我尝试了以下方法,
- 试图仅出于排序目的将localeString转换回UTC,但不幸的是找不到该实用程序。
- 我无法对数组进行排序,因为我需要此功能是动态的。
- 要求是根据日期和日期在不同位置对日期进行排序。
对此表示感谢,
解决方法
通过momentjs https://momentjs.com/docs/#/parsing/string-format/解析到日期对象的语言环境日期字符串。
然后在排序函数中,将数字日期值与<
和>
比较(a.valueOf()
/ b.valueOf()
),而不是比较ISO字符串。