比较 swift 中的 DateComponents

Compare DateComponents in swift

在Swift中有没有方便的表达方式,例如,15 个月大于 1 年,1 周小于 10 天?我觉得 DateComponents 最能代表我的需求,所以我需要这样的东西:

DateComponents(year: 1) > DateComponents(month: 15) // => false
DateComponents(day: 10) > DateComponents(weekOfMonth: 1) // => true

但据我了解,目前 swift DateComponents 不可比较(二元运算符 '>' 不能应用于两个 'DateComponents' 操作数)。

所以也许任何人都可以帮助我找到纯 swift 或使用某些库的解决方案?提前致谢!

您可以从 DateComponents 创建日期并进行比较。你可以让 DateComponents 符合 Comparable:

extension DateComponents: Comparable {
    public static func < (lhs: DateComponents, rhs: DateComponents) -> Bool {
        let now = Date()
        let calendar = Calendar.current
        return calendar.date(byAdding: lhs, to: now)! < calendar.date(byAdding: rhs, to: now)!
    }
}
    

然后你可以做那些比较:

DateComponents(year: 1) > DateComponents(month: 15) // => false
DateComponents(day: 10) > DateComponents(weekOfMonth: 1) // => true

您可能还想制作它 Equatable:

extension DateComponents: Equatable {
    public static func == (lhs: DateComponents, rhs: DateComponents) -> Bool {
        let now = Date()
        let calendar = Calendar.current
        return calendar.date(byAdding: lhs, to: now)! == calendar.date(byAdding: rhs, to: now)!
    }
}

免责声明:此修改后的答案使用当前的 date/time 作为参考,以确保对天数和月份进行有意义的比较(假设每个月的天数可以更改)。像“一个月有超过 30 天”这样的问题只有在来电者提供参考日期或我们使用“现在”(我在上面所做的)时才有意义。

请注意,通过使用“现在”作为参考日期,“24 小时或 1 天哪个更大”等比较现在将包含夏令时(例如,取决于您的日历是否会“spring 前进”,“后退”,或者,绝大多数时候,根本没有改变)。