检查日期是否在下个月

时间:2018-03-23 09:32:09

标签: ios swift core-data nsdate

我正在设置某个birthdayTextField的日期,就像这样

@objc func birthdayDatePickerValueChanged(sender: UIDatePicker) {
    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeStyle = .none
    birthdayTextField.text = formatter.string(from: sender.date)

}

现在,此文本字段值存储在字符串属性中的coredata中。可以在coredata中存储许多这样的生日日期。现在,当我从数据库中获取这些日期时,我想在tableview中仅显示下个月的日期。

如何实现......?

1 个答案:

答案 0 :(得分:1)

这是一个使用Calendar强大的日期数学能力以及DateComponents扩展中的Date的解决方案。

  • 它会在nextDate(after:matching:matchingPolicy:)寻找day == 1
  • 的情况下计算下个月的第一天
  • 它将给定日期与下个月的第一个日期与month的{​​{1}}粒度进行比较。
compare(:to:toGranularity:)

只在您的方法

中使用它
extension Date {
    func isDateInNextMonth() -> Bool {
        let calendar = Calendar.current
        let nextMonth = calendar.nextDate(after: Date(), matching: DateComponents(day:1), matchingPolicy: .nextTime)!
        return calendar.compare(self, to: nextMonth, toGranularity: .month) == .orderedSame
   }
}

或者 - 更多才多艺 - 根据其他 isDateIn ... 方法作为sender.date.isDateInNextMonth()

的扩展名
Calendar

并使用它

extension Calendar {
    func isDateInNextMonth(_ date : Date) -> Bool {
        let nextMonth = self.nextDate(after: Date(), matching: DateComponents(day:1), matchingPolicy: .nextTime)!
        return self.compare(date, to: nextMonth, toGranularity: .month) == .orderedSame
    }
}

修改

如果你想检查日期是否在接下来的30天内,那就更容易了

Calendar.current.isDateInNextMonth(sender.date)