【问题标题】:Sort a list of dates by time in Javascript在Javascript中按时间对日期列表进行排序
【发布时间】:2018-05-04 21:07:21
【问题描述】:

我有一个这样的数组对象:

[
 {
  _id: 1
  date: '2018-05-04T12:28:00-07:00' //12:28pm
 },
 {
  _id: 2
  date: '2018-04-29T08:24:00-07:00' //8:24am
 },
 {
  _id: 3
  date: '2018-05-04T10:29:00-07:00' //10:29am
 }

现在,无论日期如何,我只想按“TIME”对这个数组进行排序

排序后的数组应如下所示:

[
 {
  _id: 2
  date: '2018-04-29T08:24:00-07:00' //8:24am
 },
 {
  _id: 3
  date: '2018-05-04T10:29:00-07:00' //10:29am
 },
 {
  _id: 1
  date: '2018-05-04T12:28:00-07:00' //12:28pm
 }
]

如何用 Javascript 编写这段代码?

我试过了:

sorted.sort((a, b) => {
  return new Date(a.start_ts).getUTCHours() - new Date(b.start_ts).getUTCHours()
})

但似乎给我一个错误,“不能在不可变数据结构上调用排序方法。”

【问题讨论】:

  • date 属性是字符串还是日期对象?到目前为止,您尝试过什么?
  • 语法似乎无效。
  • 日期应为字符串格式,也缺少逗号分隔对象属性。
  • 也...,没有 cmets //
  • 对不起,它们是字符串

标签: javascript arrays sorting date


【解决方案1】:

您的代码无法工作,因为正在排序的对象没有 start_ts 属性。如果您发布有效的 javascript,它也会有所帮助。

给定时间组件的格式,可以使用 date 属性和 localeCompare 将对象排序为字符串:

var data = [
   {_id: 1, date: '2018-05-04T12:28:00-07:00'},
   {_id: 2, date: '2018-04-29T08:24:00-07:00'},
   {_id: 3, date: '2018-05-04T10:29:00-07:00'}
];

data.sort((a, b) => a.date.substr(11,8).localeCompare(b.date.substr(11,8)));

console.log(data);

【讨论】:

    【解决方案2】:

    无需搞乱日期,只需提取每个字符串的小时/分钟/秒并进行相应排序:

    const arr = [{
        _id: 1,
        date: '2018-05-04T12:28:00-07:00' //12:28pm
      },
      {
        _id: 2,
        date: '2018-04-29T08:24:00-07:00' //8:24am
      },
      {
        _id: 3,
        date: '2018-05-04T10:29:00-07:00' //10:29am
      }
    ];
    const hmsVal = str => {
      const [,h, m, s] = str.match(/(\d\d):(\d\d):(\d\d)/);
      return Number(h) * 3600 + Number(m) * 60 + Number(s);
    };
    arr.sort((a, b) => hmsVal(a.date) - hmsVal(b.date));
    console.log(arr);

    【讨论】:

    • 这假定所有对象的时区都相同。
    • 这就是答案。谢谢!
    • 这个答案没有解释为什么 OP 的代码会失败,或者它是如何修复它的。它只是提供了全新的代码。
    【解决方案3】:

    考虑到仅按“TIME”对该数组进行排序,而不考虑日期

    const input = [{
        _id: 1,
        date: "2018-05-04T12:28:00-07:00"
      },
      {
        _id: 2,
        date: "2018-04-29T08:24:00-07:00"
      },
      {
        _id: 3,
        date: "2018-05-04T10:29:00-07:00"
      }
    ];
    input.sort((a,b) => {
      return getDate(a) - getDate(b)
    });
    
    function getDate(i) {
      let temp = new Date(i.date);
      let currentDate = new Date();
      temp.setUTCFullYear(currentDate.getUTCFullYear(),
        currentDate.getUTCMonth(),
        currentDate.getUTCDate());
      return temp;
    }
    console.log(input);

    setUTCFullYear().

    【讨论】:

    • 您应该只创建一个额外的日期,而不是 5。初始化 temp 后,将其设置为固定日期并在一个语句中返回时间值:return temp.setUTCFullYear(1970,0,1)。此外,new Date(temp) 没有任何用处,它只是创建了 temp 的副本。 ;-)
    • @RobG。谢谢。已按照您的建议更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2012-12-22
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多