Убедитесь, что возвращенные даты в течение семи дней с текущей даты - PullRequest
0 голосов
/ 05 февраля 2019

В настоящее время я использую эту группу функций для фильтрации объектов даты, которые используются внутри моего приложения.

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 дней текущего дня.Таким образом, если объект даты встречается 11 февраля, он также должен быть возвращен.В настоящее время то, что у меня есть, ничего не вернет, если только оно не будет в той же календарной неделе.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я предполагаю, что вы хотите учитывать только часть календарной даты каждого Date и игнорировать время суток.Таким образом, вы считаете, что 2019-02-01-12: 00: 00 находятся в пределах 7 дней с 2019-02-08-14: 00: 00, даже если между этими двумя моментами есть 7 дней и 2 часа, что большеровно через 7 дней.

Вы можете использовать два метода Calendar для вычисления разницы в календарных днях между двумя Date с, игнорируя время суток.Сначала получите компоненты года, месяца и дня для каждого 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 - число дней между двумя входными датами со знаком.Это положительно, если b после a, и отрицательно, если b предшествует a.

. Я бы обернул это в расширение на 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")
}
0 голосов
/ 05 февраля 2019

Это решение, которое получает дату окончания с nextDate(after:matching:matchingPolicy:) API, равным Calendar

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...