javascript - 对格式不正确的日期进行排序
问题描述
我正在从 excel 表中获取输入,并且日期不是可以操作的正确 ISO 格式,即该列如下所示,我正在尝试使用 javascript 日期和时刻将其转换为正确日期来对其进行排序但是我是没有得到正确的输出我可以在这个问题上使用第二个意见。
输入
["28/02/23","31/12/21","31/05/21","30/09/23","31/10/22","30/09/21","30/06/23","31/05/22","30/04/21","31/07/21","30/06/21","28/02/22","31/12/22","30/06/22","31/08/21","30/04/22","31/10/20","31/08/22","31/07/22","31/05/23","31/01/23","30/04/23","30/09/22","28/02/21","30/11/20","30/11/21","31/01/21","31/03/23","31/01/22","31/07/23","31/12/20","31/03/21","31/08/23","30/11/22","31/10/21","31/03/22","30/09/20"]
我写的方法
dateCompare = (d1, d2) => { let d1Component = d1.toString().split('/') , d2Component = d2.toString().split('/') , rD1 = new Date(parseInt(20 + d1Component[2]), d1Component[1] - 1, d1Component[0]) , rD2 = new Date(parseInt(20 + d2Component[2]), d2Component[1] - 1, d2Component[0]) return moment(rD1).isAfter(moment(rD2)) }
我从上述方法得到的输出是
["30/09/35", "28/02/23", "31/05/21", "31/12/21", "31/10/22", "30/09/21", "30/09/20", "31/05/22", "30/04/21", "31/07/21", "30/06/21", "28/02/22", "31/12/22", "30/06/22", "31/08/21", "30/04/22", "31/10/20", "31/08/22", "31/07/22", "31/03/22", "31/01/23", "31/10/21", "30/09/22", "28/02/21", "30/11/20", "30/11/21", "31/01/21", "30/11/22", "31/01/22", "31/03/21", "31/12/20", "31/01/37", "31/07/23", "31/03/23", "30/04/23", "31/05/23", "30/06/23", "30/04/37", "31/10/23", "31/08/23", "30/09/23", "30/06/37", "29/02/24", "30/11/23", "31/12/23", "31/01/24", "31/08/37", "31/07/24", "31/03/24", "30/04/24", "31/05/24", "30/06/24", "30/11/37", "31/01/25", "31/08/24", "30/09/24", "31/10/24", "30/11/24", "31/12/24", "31/03/38", "31/08/25", "28/02/25", "31/03/25", "30/04/25"]
我认为根本没有以任何方式排序的。
解决方案
比较函数应该返回一个负数来表示小于,一个正数表示大于,并且0
等于,而不是true
/ false
。此外,由于您已经在使用moment
,因此也可以使用它来解析日期:
function dateCompare(d1, d2) {
const d1Parsed = moment(d1, "DD/MM/YY");
const d2Parsed = moment(d2, "DD/MM/YY");
if (d1Parsed.isBefore(d2Parsed)) {
return -1;
} else if (d1Parsed.isSame(d2Parsed)) {
return 0;
} else {
return 1;
}
}
或者,取它们的时间戳的差异(如果d1Parsed
在之前,d2Parsed
那么它的时间戳会更小,所以得到的减法将是负数,如果它们相等,它将是 0,如果它更大,它将是正数,做与前面的代码相同):
function dateCompare(d1, d2) {
const d1Parsed = moment(d1, "DD/MM/YY");
const d2Parsed = moment(d2, "DD/MM/YY");
return d1Parsed.valueOf() - d2Parsed.valueOf();
}
推荐阅读
- android - 如何使用科尔多瓦从 APK 文件构建中获取科尔多瓦版本号。
- java - 当使用 Spring Security 的 IF_REQUIRED 会话创建策略时,创建新会话必须满足哪些条件?
- python-3.x - python表现不检测步骤文件
- mariadb - 无法在 Mariadb Galera 集群上添加或更新子行错误
- microsoft-graph-api - 保护订阅了 Graph 订阅的 Azure 函数
- java - 更好地使用变量或始终调用方法?
- python - 根据多列值的组合选择不同的熊猫数据框
- python - Django不按日期过滤
- javascript - 如何根据 props 更新 React 组件状态
- mongodb - 服务器上的多查询流星