快速比较 DateComponents

Ego*_*kov 2 date nsdatecomponents swift

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

DateComponents(year: 1) > DateComponents(month: 15) // => false
DateComponents(day: 10) > DateComponents(weekOfMonth: 1) // => true
Run Code Online (Sandbox Code Playgroud)

但据我了解,目前在 swift DateComponents 中是不具有可比性的(二元运算符“>”不能应用于两个“DateComponents”操作数)。

所以也许任何人都可以帮助我找到纯粹的快速解决方案,或者使用一些库?先感谢您!

Rob*_*Rob 6

您可以从中创建日期DateComponents并进行比较。您可以使DateComponents符合Comparable

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

然后你可以进行这些比较:

\n
DateComponents(year: 1) > DateComponents(month: 15) // => false\nDateComponents(day: 10) > DateComponents(weekOfMonth: 1) // => true\n
Run Code Online (Sandbox Code Playgroud)\n
\n

您可能还想做到Equatable

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

免责声明:此修订后的答案使用当前日期/时间作为参考,以确保对天和月进行有意义的比较(假设每月的天数可以改变)。像 \xe2\x80\x9care 这样的问题一个月中超过 30 天\xe2\x80\x9d 仅当调用者提供参考日期或者我们使用 \xe2\x80\x9cnow\xe2\x80\x9d (即我上面所做的\xe2\x80\x99)。

\n

请注意,通过使用 \xe2\x80\x9cnow\xe2\x80\x9d 作为参考日期,然后像 \xe2\x80\x9c 这样较大的比较,24 小时或 1 天\xe2\x80\x9d 现在将包含夏令时(例如,取决于您的日历是否将\xe2\x80\x9c向前\xe2\x80\x9d、\xe2\x80\x9c向后\xe2\x80\x9d,或者在绝大多数情况下根本不会改变) 。

\n

  • 这是一个更好的方法。我将删除我的帖子,因为您无法仅从 weekOfMonth 构建日期 (2认同)
  • 是的,但默认是按元素进行比较,其中 1 年的日期部分不等于 12 个月。 (2认同)