在Swift中按时间升序对时间字符串(HH:mm)进行排序

时间:2018-06-27 21:33:38

标签: swift

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

不知道这是否是最好的方法,但是我已经尝试过基于Sort Objects in Array by 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]

有人有什么主意吗?

1 个答案:

答案 0 :(得分:2)

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

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()

这仅适用于您只有数字并且数字以前导零填充的情况。如果这两种情况都不存在,则需要第一个选择。