比较 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 前进”,“后退”,或者,绝大多数时候,根本没有改变)。
在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 前进”,“后退”,或者,绝大多数时候,根本没有改变)。