【问题标题】:Sort Dates in Javascript in format dd/mm/yyyy以 dd/mm/yyyy 格式对 Javascript 中的日期进行排序
【发布时间】:2019-12-16 01:08:03
【问题描述】:

我对函数排序日期有点问题。我想按 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;
})

【问题讨论】:

  • 致投票的人:您能为我们其他人解释一下 OP 的“排序不正确”是什么意思吗?
  • @John_ReinstateMonica 从上下文中可以清楚地看出,OP 的系统正在以 MM/dd/yyyy 格式解释日期并按顺序对其进行排序,而不是将它们解析为 dd/MM/yyyy,这是 OP 的意图。跨度>

标签: javascript sorting date


【解决方案1】:

切勿使用new Date(string) 构造函数或Date.parse() 来解析日期字符串,因为这两种方法都不允许您提供特定格式或区域信息。 (Annoyingly, JavaScript's built-in Intl does not support parsing, only formatting)。

JavaScript 的 new Date(string)Date.parse(string) 函数使用倾向于使用用户计算机的区域设置来解析日期 - 如果用户在没有意识到的情况下使用 Windows 的 en-US 设置,那么 Date.parse(string)new Date(string) 将解释日期为MM/dd/yyyy,而不是正确的区域设置。然而,浏览器倾向于解析你扔给他们的任何东西,如果他们看到12/31/201931/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() );

【讨论】:

  • 感谢您的帮助,它可以将我的日期转换为其他格式,但这很好:)
  • @valentyn 还有哪些其他日期格式?你没有在帖子中提到这一点。
【解决方案2】:

这是因为日期是英国格式,所以它会按升序排列它们,而不考虑月份或年份。如果您将它们转换为 YYYY-MM-DD 格式,它将为您正确排序:

let a = ["03/12/2019", "17/10/2020", "02/12/2019", "08/12/2019", "13/02/2020"]; // etc.

function ukToUsDate(ukDate) {
  let dateArr = ukDate.split('/');

  return `${dateArr[2]}-${dateArr[1]}-${dateArr[0]}`;
}

for (let i = 0; i < a.length; i++) {
  a[i] = ukToUsDate(a[i]);
}

a.sort((b, a) => {
 if (b > a) {
   return 1;
 }
 if (b < a) {
   return -1;
 }
 return 0;
});

【讨论】:

    【解决方案3】:
    const sortDate = (date1,date2) => {
    const a = date1.split("/").map((i) => parseInt(i));
    const b = date2.split("/").map((i) => parseInt(i));
    return a[2] > b[2]
      ? 1
      : a[2] < b[2]
      ? -1
      : a[1] > b[1]
      ? 1
      : a[1] < b[1]
      ? -1
      : a[0] > b[0]
      ? 1
      : a[0] < b[0]
      ? -1
      : -1;
    };
    

    打电话

    sortDate("01/11/2011","23/02/2010"); //returns 1
    

    如果 date1 更大,则返回 1。如果 date2 更大,则返回 -1。

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多