【问题标题】:Make sure returned dates are within seven days of current date确保返回日期在当前日期的 7 天内
【发布时间】:2019-02-05 03:26:38
【问题描述】:

目前我正在使用这组函数来过滤在我的应用程序中使用的日期对象。

func isInSameWeek(date: Date) -> Bool {
    return Calendar.current.isDate(self, equalTo: date, toGranularity: .weekOfYear)
}
func isInSameMonth(date: Date) -> Bool {
    return Calendar.current.isDate(self, equalTo: date, toGranularity: .month)
}
func isInSameYear(date: Date) -> Bool {
    return Calendar.current.isDate(self, equalTo: date, toGranularity: .year)
}
func isInSameDay(date: Date) -> Bool {
    return Calendar.current.isDate(self, equalTo: date, toGranularity: .day)
}
var isInThisWeek: Bool {
    return isInSameWeek(date: Date())
}
var isInToday: Bool {
    return Calendar.current.isDateInToday(self)
}
var isInTheFuture: Bool {
    return Date() < self
}
var isInThePast: Bool {
    return self < Date()
}

它们工作正常,但唯一的问题是我想返回当前日期 7 天内的日期对象。因此,如果日期对象发生在 2 月 11 日,那么它也应该被返回。目前我不会返回任何东西,除非它确实在同一个日历周内。

【问题讨论】:

  • Check if date falls between 2 dates - 只需创建两个距离当前日期 +/- 7 天的日期并进行比较
  • 所以基本上你想说的是你从stackoverflow.com/a/43664156/1974224复制+粘贴代码,你需要添加新功能但你不知道怎么做?你至少应该说明你是从哪个人那里获取代码的。
  • 如果当前时刻是 2019-02-01-12:00:00,您会认为 2019-02-08-14:00:00 是“7 天内”吗?这两个瞬间相差 7 天 2 小时。
  • @robmayoff 从技术上讲不是,但我只是想要一整天

标签: ios swift date dateformatter


【解决方案1】:

这是使用CalendarnextDate(after:matching:matchingPolicy:) API 获取结束日期的解决方案

extension Date {
    func isInSevenDays() -> Bool {
        let now = Date()
        let calendar = Calendar.current
        let weekday = calendar.dateComponents([.weekday], from: now)
        let startDate = calendar.startOfDay(for: now)
        let nextWeekday = calendar.nextDate(after: now, matching: weekday, matchingPolicy: .nextTime)!
        let endDate = calendar.date(byAdding: .day, value: 1, to: nextWeekday)!
        return self >= startDate && self < endDate
    }
}

【讨论】:

  • 是的,例如,如果今天是星期三,我想显示直到下星期三的日期
  • 直到下周三仍然是模棱两可的。请指定今天、星期二、中午 (12:00) 的确切日期范围(如我的回答)
  • 抱歉,例如 2 月 5 日星期二至 2 月 12 日星期二
  • *叹气*也请加上时间。
  • 抱歉,例如 2 月 5 日星期二 (00:00) 到 2 月 12 日星期二 (23:59)
【解决方案2】:

我假设您只想考虑每个 Date 的日历日期部分,而忽略一天中的时间。因此,您会认为 2019-02-01-12:00:00 在 2019-02-08-14:00:00 的 7 天内,即使这两个瞬间之间有 7 天 2 小时,这更多确切地说是 7 天以上。

您可以使用两个 Calendar 方法来计算两个 Dates 之间的日历天差,忽略一天中的时间。首先,获取每个Date 的年、月、日组件,丢弃一天中的时间部分:

    let aymd = calendar.dateComponents([.year, .month, .day], from: a)
    let bymd = calendar.dateComponents([.year, .month, .day], from: b)

然后向Calendar询问两个DateComponents之间的天数差异:

    let diff = dateComponents([.day], from: aymd, to: bymd).day!

diff 是两个输入日期之间的带符号天数。如果ba 之后,则为正,如果ba 之前,则为负。

我会在Calendar 的扩展中将其包装起来,如下所示:

extension Calendar {

    func roundedDays(from a: Date, to b: Date) -> Int {
        let aymd = dateComponents([.year, .month, .day], from: a)
        let bymd = dateComponents([.year, .month, .day], from: b)
        let diff = dateComponents([.day], from: aymd, to: bymd).day!
        return diff
    }

}

那么你可以这样使用它:

let calendar = Calendar.autoupdatingCurrent

if abs(calendar.roundedDays(from: Date(), to: targetDate)) <= 7 {
    print("\(targetDate) is within 7 days of now")
}

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 2023-02-23
    • 2018-10-25
    • 1970-01-01
    • 2012-04-29
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多