【问题标题】:Check if date is in coming month检查日期是否在下个月
【发布时间】:2018-09-01 22:25:57
【问题描述】:

我正在为某个生日文本字段设置日期

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

}

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

如何实现...?

【问题讨论】:

  • 为什么将日期存储为字符串?您应该将其存储为日期对象,而不是字符串。
  • .@Psytho 是否有必要始终将日期存储为日期对象..?只是问,因为我不确定....
  • 没有。但是这样做可以让您轻松知道哪些日期在一个月内。
  • 这不是必需的,但它更有效,因为您可以轻松地从使用谓词以任何方式排序/过滤的 CoreData 中获取数据。
  • 好的..到目前为止,这就是我保存到 coredata 的方式...newProdObj.setValue(self.birthdayTextField.text, forKey: "birthday")。要保存为 nsdate 对象,将 coredata 属性(在这种情况下为 birthday)从 string 更改为 Date 就足够了,否则是否需要更改其他任何内容...?

标签: ios swift core-data nsdate


【解决方案1】:

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

  • 它计算下个月的第一天,nextDate(after:matching:matchingPolicy:) 寻找day == 1
  • 它将给定日期与下个月的第一个日期与month 粒度与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
   }
}

在你的方法中简单地使用它

sender.date.isDateInNextMonth()

或者——更通用——根据其他 isDateIn... 方法作为 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
    }
}

并使用它

Calendar.current.isDateInNextMonth(sender.date)

编辑:

如果你想检查日期是否在接下来的 30 天内,它仍然更容易

extension Calendar {
    func isDateInNextThirtyDays(_ date : Date) -> Bool {
        return self.dateComponents([.month], from: Date(), to:date).month! < 1
    }
}

【讨论】:

  • 我的约会对象是这样的...2018-03-29 18:30:00 +0000。但是当我打印Calendar.current.isDateInNextMonth(result.birthday!) 时,我得到了false。我不应该得到true,因为日期正好在下个月之内...?
  • 从今天(2018-03-23)来看下个月是4月(04)
  • No 下个月在 April,1- April,30 的范围内。您可能的意思是检查日期是否在接下来的 30 天内,这是另一回事。
  • 其实我想包括从明天到下个月的所有日期...:)
猜你喜欢
  • 2015-05-17
  • 2011-08-15
  • 2013-04-01
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多