【问题标题】:Sorting time strings (HH:mm) in ascending order in Swift在Swift中按升序对时间字符串(HH:mm)进行排序
【发布时间】:2018-06-27 21:33:38
【问题描述】:

我想在 Swift 4 中从 00:00 -> 23:59 升序对时间数组进行排序。我的应用程序没有对日历的任何引用,因为它用于使用外部硬件时钟注册闹钟时间作为一个非常基本的警报,它只是从 00:00 -> 23:59 开始,然后结束。

不确定这是否是最好的方法,但我已经尝试了基于Sort Objects in Array by date 的以下代码 但我不能让它只用时间。 (date) 对象未能初始化。它不喜欢初始示例中的 (dateStyle) 和 (timeStyle) 更改。代码如下:

let testArray = ["23:59", "01:23", "18:23", "04:42", "00:00"]
  var convertedArray: [Date] = []

  var dateFormatter = DateFormatter()
  dateFormatter.dateFormat = "HH:mm"
  dateFormatter.dateStyle = .none
  dateFormatter.timeStyle = .short

  for dat in testArray {
     let date = dateFormatter.date(from: dat)
     if let date = date {
        convertedArray.append(date)
     }
  }

  var ready = convertedArray.sorted(by: { $0.compare($1) == .orderedAscending })

  print(ready)

打印功能在工作时应按以下顺序打印排序后的数组:

[00:00, 01:23, 04:42, 18:23, 23:59]

有人有什么想法吗?

【问题讨论】:

    标签: swift


    【解决方案1】:

    您不需要将字符串转换为日期。只需将字符串排序为数字即可。

    let testArray = ["23:59", "01:23", "18:23", "04:42", "00:00"]
    let sortedArray = testArray.sorted { $0.localizedStandardCompare($1) == .orderedAscending }
    print(sortedArray)
    

    输出:

    [“00:00”、“01:23”、“04:42”、“18:23”、“23:59”]

    事实证明,由于您的每个时间字符串都采用了很好的固定格式HH:mm,您甚至不需要使用localizedStandardCompare。您可以通过以下方式获得所需的结果:

    let sortedArray = testArray.sorted()
    

    这仅在您只有数字并且数字用前导零填充时才有效。如果其中任何一种情况都不存在,您将需要第一个选项。

    【讨论】:

    • 如果所有字符串都具有相同的固定格式,则只需 testArray.sorted()
    • @MartinR 哈哈。有时显而易见的事情太明显了。
    • Brilliant @rmaddy!,更简洁的方法和一条线的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多