javascript - 以 dd/mm/yyyy 格式对 Javascript 中的日期进行排序
问题描述
我对函数排序日期有一点问题。我想按 ASC 或 DESC 对所有日期进行排序,但排序不正确。
我的约会
let a = [
"03/12/2019", "17/10/2020", "02/12/2019", "08/12/2019", "13/02/2020",
"23/03/2020", "18/11/2020", "29/02/2020", "05/12/2019", "03/06/2020",
"06/05/2020", "09/09/2020", "28/10/2020", "07/04/2020", "27/04/2020",
"28/05/2020", "29/12/2019", "31/10/2020", "23/09/2020", "25/12/2019",
"14/01/2020", "30/09/2020", "18/05/2020", "14/06/2020", "25/04/2020",
"19/08/2020", "26/03/2020", "19/05/2020", "15/03/2020", "11/10/2020",
"25/04/2020", "16/12/2019", "14/08/2020", "19/08/2020", "28/02/2020",
"01/01/2020", "07/06/2020", "17/11/2020", "22/05/2020", "31/07/2020",
"20/01/2020", "07/02/2020", "18/08/2020", "16/02/2020", "13/03/2020",
"21/12/2019", "02/03/2020", "24/07/2020", "01/05/2020", "31/01/2020",
"25/11/2020", "07/07/2020", "16/07/2020", "06/07/2020", "16/09/2020",
"29/07/2020", "19/06/2020", "09/08/2020", "25/08/2020", "21/02/2020",
"30/11/2019", "04/06/2020", "06/09/2020", "10/09/2020", "26/11/2020",
"22/07/2020", "21/05/2020", "25/07/2020", "05/01/2020", "17/06/2020",
"14/07/2020"
];
函数排序
b.sort((d1, d2) => new Date(d1).getTime() - new Date(d2).getTime());
或替代
b.sort((b, a) => {
if (b > a) {
return 1;
}
if (b < a) {
return -1;
}
return 0;
})
解决方案
永远不要使用new Date(string)
构造函数,也不要Date.parse()
解析日期字符串,因为这两种方法都不允许您提供特定的格式或语言环境信息。(烦人的是,JavaScript 的内置Intl
不支持解析,只支持格式化)。
JavaScriptnew Date(string)
和Date.parse(string)
函数使用倾向于使用用户计算机的区域设置来解析日期 - 如果用户在没有意识到的情况下使用 Windows 的 en-US 设置,那么Date.parse(string)
会将new Date(string)
日期解释为MM/dd/yyyy
而不是正确的区域设置。然而,浏览器倾向于尝试解析你扔给他们的任何东西,如果他们看到12/31/2019
,或者31/12/2019
他们都会被解析为2019-12-31
不管他们的计算机区域设置如何——只有在给定它们的情况下,事情才会崩溃5/7/2019
,例如,这将被解释为2019-05-07
如果他们在美国或2019-07-05
在英国。
不幸的是,您需要手动解析它们或使用 Moment.JS 等经过同行评审的库(因为编写日期库很难)。
let dates = [ "03/12/2019", "17/10/2020", "02/12/2019", ... ];
function parseDate( ddMMyyyy ) {
const components = ddMMyyyy.split( '/' );
if( components.length != 3 ) return null;
const dd = parseInt( components[0] );
const MM = parseInt( components[1] );
const yyyy = parseInt( components[2] );
// Component range checking:
if( dd >= 1 && dd <= 31 && MM >= 1 && MM <= 12 && yyyy >= 0 && yyyy <= 9999 ) {
return new Date( yyyy, MM - 1, dd ); // `MM - 1` because JavaScript months are 0-based.
}
else {
return null;
}
}
let sortedParsedDates = dates
.map( parseDate )
.filter( dt => dt instanceof Date )
.sort( ( x, y ) => x.getTime() - y.getTime() );
推荐阅读
- android - 签署 apk 后 Firebase 无法正常工作
- sql - PL PQL 没有正确执行
- python - Python:如何在一个模块中初始化对象并在另一个模块中使用它
- c# - C# XML 序列化 XMLElement 路径
- r - R Shiny:输出名称和for循环问题
- javascript - 我无法在 Javascript 图表上显示我的数据
- reactjs - 如何从两个不同的子级别从 firebase 数据库中获取数据?
- python - Pandas - 连接不同的列级别 MultiIndex DataFrames
- c# - 如何使用带有 post 方法的 pagedlist
- exception - 抛出未经授权的异常以被 UseStatusCodePagesWithReExecute 捕获