【问题标题】:Angular - Order By TimeAngular - 按时间排序
【发布时间】:2014-10-03 19:08:51
【问题描述】:

我有一个带有时间键和值的 json 对象,例如:

[
    {
        "name" : "Meeting 1",
        "time" : "9:30am",
        "day" : "Sunday",
        "location" : "Summit",
    },
    {
        "name" : "Meeting 2",
        "time" : "10:00am",
        "day" : "Sunday",
        "location" : "Juab",
    }
]

我想做的是按时间属性对它们进行排序,但你可以看到两难境地。如果我使用 Angular 的 orderBy 方法,它会说 10:00 am 应该在 9:00 am 之前。我想过将对象拆分为上午和下午,但最终还是遇到了同样的问题。

我是 Angular 的新手,所以我不知道解决这个问题的最佳方法。有什么想法吗?

【问题讨论】:

  • 您要么编写一个足够智能的自定义过滤器以按照您想要的方式进行排序,要么尝试利用现有库(例如 moment.js)中的功能......无论哪种方式,看起来你都需要自定义过滤器
  • 没有日期,谁能说9:00早于10:00?第 1 天的 10:00 可能在第 2 天的 9:00 之前。考虑 24x7 全天候运营的公司。晚上 11:00 的会议可能早于凌晨 2:00 的会议。
  • @MattJohnson 你是对的。上面的示例仅用于示例目的。这些对象实际上具有日期属性,我按星期几过滤它们。
  • 请展示您实际使用的示例真实值。否则答案会完全不同。

标签: javascript angularjs


【解决方案1】:

最简单的方法是将 12 小时 (AM/PM) 转换为 24 小时时间整数。

例如(来自:convert 12-hour hh:mm AM/PM to 24-hour hh:mm):

function convertTo24Hour(time) {
    var hours = parseInt(time.substr(0, 2));
    if(time.indexOf('am') != -1 && hours == 12) {
        time = time.replace('12', '0');
    }
    if(time.indexOf('pm')  != -1 && hours < 12) {
        time = time.replace(hours, (hours + 12));
    }
    time = time.replace(':','').trim();
    return parseInt(time.replace(/(am|pm)/, ''));
}

因此,下午 1:00 现在是 1300,下午 2:00 是下午 1400 等等...这样您就可以正确排序,而无需使用更复杂的日期函数。

您可以转换回用于显示或为您的对象创建第三个属性作为 time_24。

这不是一个完整的灵魂,而是一个起点。更多详情请见Descending order by date filter in AngularJs

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 2016-01-15
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2018-08-10
    • 2018-03-02
    相关资源
    最近更新 更多