【问题标题】:Compare DateComponents in swift快速比较 DateComponents
【发布时间】:2021-02-07 10:36:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 似乎是一个 x-y 问题?你真正想做什么?
  • @JoakimDanielson DateComponents 确实支持大于 12 的月份值
  • @matt 如果没有您使用我的应用程序,这很难描述 tbh :) 例如,将其想象为您的订阅(Spotify、YouTube 等)周期之一,它们可以是每月、每年等在。所以我只想知道,您的哪个订阅周期最长,只有 Calendar.Component(月/年)和 Int(月/年数量)
  • “所以我只想知道,您的哪个订阅的周期最长,只有 Calendar.Component(月/年)和 Int(月/年数量)”问那个问题!

标签: swift date nsdatecomponents


【解决方案1】:

您可以从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)!
    }
}

免责声明:此修订后的答案使用当前日期/时间作为参考,以确保有意义地比较日期和月份(假设每月的天数可以更改)。只有当调用者提供参考日期或我们使用“现在”(这就是我上面所做的)时,“一个月中是否有超过 30 天”之类的问题才有意义。

请注意,通过使用“现在”作为参考日期,“24 小时还是 1 天”之类的比较现在将包含夏令时(例如,取决于您的日历是否会“提前”、“下降back”,或者,绝大多数时候,根本没有改变)。

【讨论】:

  • 这是一个更好的方法。我将删除我的帖子,因为您无法仅从 weekOfMonth 构建日期
  • 玩了一下,没发现什么缺点,会用这个,谢谢!
  • 1970 在这里并不是特别有用;建议只使用 Date 的零表示。
  • @Jessy 我认为现在使用更好的选择
  • 是的,但默认是进行元素比较,其中 1 年的日期部分不等于 12 个月。
猜你喜欢
  • 2011-10-02
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多