如何快速比较阈值内的两个字符串值?

问题描述

我正在尝试编写一个有两次时间[hh:min]数据(字符串类型)的代码。需要比较,但挑战是我的代码在返回最终值之前经过了一些验证。因此断言有时会失败,指出期望值是[17:04],而实际值是[17:05]。有什么方法可以使用“阈值”概念,直到几分钟(例如2分钟),比较仍然有效?

解决方法

第一步是不要将事物存储为不是的事物。如果是时间,则应将它们作为时间存储 。字符串用于表示用户。基础存储是现实。

现在让我们将时间存储为日期部分:

let t1 = DateComponents(hour:17,minute:4)
let t2 = DateComponents(hour:17,minute:5)

现在很容易找出它们之间的距离:

let cal = Calendar(identifier: .gregorian)
if let d1 = cal.date(from: t1),let d2 = cal.date(from: t2) {
        let diff = abs(d1.timeIntervalSince(d2))
        // and now decide what to do
}
,

您首先需要将字符串分隔为数组,然后才能进行比较。

/* That two arrays are A1 and A2 */
let minute1 = Int(A1[0])*60+Int(A1[1])
let minute2 = Int(A2[0])*60+Int(A2[1])

这可能会对您有所帮助。我认为@Sweeper不了解这是时间,而不是日期。

,

您可以将字符串转换为分钟,再减去一个,然后检查绝对值是否小于阈值:

extension String {
    var time24hToMinutes: Int? {
        guard count == 5,let hours = Int(prefix(2)),let minutes = Int(suffix(2)),Array(self)[2] == ":"  else { return nil }
        return hours * 60 + minutes
    }
    func time24hCompare(to other: String,threshold: Int = 2) -> Bool {
        guard let lhs = time24hToMinutes,let rhs = other.time24hToMinutes else { return false }
        return abs(lhs-rhs) < threshold
    }
}

测试:

"17:02".time24hCompare(to: "17:04")  // false
"17:03".time24hCompare(to: "17:04")  // true
"17:04".time24hCompare(to: "17:04")  // true
"17:05".time24hCompare(to: "17:04")  // true
"17:06".time24hCompare(to: "17:04")  // false