【问题标题】:Sort string array containing time in format '09:00 AM'?以“09:00 AM”格式对包含时间的字符串数组进行排序?
【发布时间】:2013-06-12 11:42:59
【问题描述】:

我正在尝试对我的数组进行排序。

数组由时间格式的数据组成。

数组:

'9:15 AM', '10:20 AM', '02:15 PM'

我应该如何排序?

我正在使用 json 服务获取这些数据并使用它来列出 jquery mobile 的 listview 中的事件。但我想按时间对事件进行排序。

更新: 我如何按日期和时间对 JSON 中的数据进行排序:

对于我使用 json 按日期和时间对数据进行排序的特殊问题,我这样做了:

$.getJSON(serviceURL + 'read.php?month_no='+month_no, function(data) {


        events = data.data;

        events.sort(function(a,b){
            a = new Date(a.event_date+' '+a.event_time);
            b = new Date(b.event_date+' '+b.event_time);
            return a<b?-1:a>b?1:0;
       });


}); 

【问题讨论】:

  • 我会将集合拆分为 2 个数组:1 个带有 AM 字符串,1 个带有 PM 字符串,然后分别对它们进行排序并一个接一个地显示它们。

标签: javascript jquery


【解决方案1】:

试试这个

var times = ['01:00 am', '06:00 pm', '12:00 pm', '03:00 am', '12:00 am'];

times.sort(function (a, b) {
  return new Date('1970/01/01 ' + a) - new Date('1970/01/01 ' + b);
});

console.log(times);

【讨论】:

  • 这正如我所愿。谢谢 。我没想过使用 Date 对象进行比较。
  • 但是你能告诉你我如何使用它来对使用 json 获得的数据进行排序。 $.getJSON(serviceURL + 'read.php?month_no='+month_no, function(data) { events = data.data; 有 events[].event_date in 'yyyy-mm-dd' 格式和 events[].event_time在上面给定的格式
【解决方案2】:

我的解决方案(时间格式如“11:00”、“16:30”..)

sortTimes: function (array) {
    return array.sort(function (a, b) {
        if (parseInt(a.split(":")[0]) - parseInt(b.split(":")[0]) === 0) {
            return parseInt(a.split(":")[1]) - parseInt(b.split(":")[1]);
        } else {
            return parseInt(a.split(":")[0]) - parseInt(b.split(":")[0]);
        }
    })
}

如果有人想知道哈哈

【讨论】:

    【解决方案3】:

    实现sort(compare) 函数并使用任意日期比较日期字符串:

    Array.sort(function (a, b) {
        return Date.parse('01/01/2013 '+a) - Date.parse('01/01/2013 '+b)
    });
    

    01/01/2013 是任意日期。

    【讨论】:

      【解决方案4】:
      var a = ['9:15 AM', '10:20 AM', '02:15 PM'];
      
      var sort = function(a){
        var sa = [],
            d = new Date(),
            ds = d.toDateString();
      
        for(var i = 0; i < a.length; i++){
          d = new Date(ds + ' ' + a[i]);
          sa.push(d);
        }
      
        sa.sort(function(a, b){return a.getTime() - b.getTime();})
        return sa;
      }
      

      【讨论】:

        【解决方案5】:
        function sortTimes(arrayOfTimes) {
        
            return arrayOfTimes.sort((a, b) => {
                const aParts = getNumericParts(a);
                const bParts = getNumericParts(b);
        
                // Sorts by hour then minute
                return aParts[0] - bParts[0] || aParts[1] - bParts[1];
            });
        
            function getNumericParts(time) {
                // accounts formats of 9:15 AM and 09:15:30 but does not handle AM/PM in comparison
                return time.split(' ')[0].split(':').map(x => +x);
            }
        }
        

        这是 Dustin Silk 答案的更简洁和高效的变体。它考虑了上午 9:15、09:15 和 09:15:30 的格式,尽管它不按秒排序。您可以通过使用 || aParts[2] - bParts[2] 作为 return 语句的一部分来添加它。

        sortTimes(['08:00', '09:00', '05:00', '08:15', '08:00']) 
        // Output ["05:00", "08:00", "08:00", "08:15", "09:00"]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-18
          • 2011-07-23
          • 2019-05-26
          • 2011-03-07
          • 2015-10-27
          • 2022-12-05
          相关资源
          最近更新 更多