Получение массива дат за определенный год


#1

Подскажите как получить массив дат например от 1 января 2018 до 31 декабря 2018?

Сейчас я от текущей даты получаю массив

    let today = Date()
    let nextDaysYear = Calendar.current.date(byAdding: .day, value: 365, to: today)!
    let myRange = datesRange(from: today, to: nextDaysYear)

    func datesRange(from: Date, to: Date) -> [Date] {
    // in case of the "from" date is more than "to" date,
    // it should returns an empty array:
    if from > to { return [Date]() }
    
    var tempDate = from
    var array = [tempDate]
    
    while tempDate < to {
        tempDate = Calendar.current.date(byAdding: .day, value: 1, to: tempDate)!
        array.append(tempDate)
    }
    
    return array
}

#2
func datesRange(from: Date, to: Date) -> [Date] {
    var fromInterval = from.timeIntervalSince1970
    let toInterval = to.timeIntervalSince1970
    var dates = [Date]()
    while fromInterval < toInterval {
        fromInterval += 60 * 60 * 24
        dates.append(Date(timeIntervalSince1970: fromInterval))
    }
    return dates
}

let formatter = DateFormatter()
formatter.dateFormat = "MM-dd-yyyy"

let result = datesRange(from: formatter.date(from: "01-01-2018")!, to: formatter.date(from: "12-31-2018")!)

print(result.count)

#4

Вопрос:
Как реализовать такой набор дат который можно сопоставить с переменной let today = Date()
и если today == определенной дате из набора {
я отправляю уведомление или еще что нибудь
}
?


#5
let result = datesRange(from: formatter.date(from: "01-01-2018")!, to: formatter.date(from: "12-31-2018")!)

let current = Date()

if let first = result.first(where: { $0 > current }), first < current.addingTimeInterval(60 * 60 * 24) {
    print(first)
}

#6

Что то туплю((. Вот этот момент не понимаю. Например мне надо текущую дату сравнить с этой 20.11.2018 и если они равны, то выполнить какую нибудь функцию.


#7

Время бежит неумолимо, начиная свой отсчёт со времён большого взрыва, для удобства подсчета оно поделено на отрезки равной длинны, (можно было и в секундах считать но часы бы на руку не помещались) одним из них является день. День это период времени равный 24 часам, у дня есть начало и если к нему прибавить 24 * 60 * 60 секунд мы получим его конец, что бы узнать попадает ли определенная дата в определенный день, мы не можем их просто сравнить т.к. день это отрезок, следовательно, дата попадающая в этот отрезок, должна быть больше начала дня и меньше его конца.

Ну и код выше можно переписать, используя преимущества свифта:

extension Date {
    static func `init`(string: String) -> Date {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ssZ"
        return formatter.date(from: string)!
    }
}

extension Date: Strideable {
    private static let interval: TimeInterval = 60 * 60 * 24
    public func distance(to other: Date) -> Int { // Количество дней от self до other
        return Int((other.timeIntervalSince1970 - timeIntervalSince1970) / Date.interval)
    }
    public func advanced(by n: Int) -> Date { // Дата через n дней
        return addingTimeInterval(TimeInterval(n) * Date.interval)
    }
}

extension Array where Element == Date {
    func contains(_ element: Date) -> Bool {
        return sorted(by: <) // Сортируем
            .last(where: { $0 < element }) // Ищем меньшую дату с конца
            .map { element < $0.addingTimeInterval(60 * 60 * 24) } // Если найдена (не nil), проверим что element меньше чем меньшая дата + день
            ?? false
    }
}

let from = Date.init(string: "2018-01-01 00:00:00+0000")
let to = Date.init(string: "2019-01-01 00:00:00+0000")
let array = Array(from..<to)
let today = Date()

if array.contains(today) {
    print("Hello")
}

#8

Спасибо)). Теперь у меня все сложилось))


#9

Еще вопрос. Сейчас все работает и уведомления приходят, но только когда приложение открыто. Как сделать что бы уведомления приходили когда приложение закрыто?


#10

Если вы хотите запустить какой-то процесс в бекграунде и думаете он вам будет слать уведомления, то это не про iOS. Уведомления можно ставить на определенную дату, или получать с сервера.


#11

Да, но уведомления согласно геолокации приходят когда приложение закрыто, поэтому я думал что возможно по датам тоже буду получать уведомления.


#12

Вам же ответили, что можно ставить на определенную дату. Используйте это.
Или вам это не подходит и у вас другой случай?


#13

Я так и делаю. Уведомление приходит. Но приходит только когда приложение открыто. Когда приложение закрыто уведомления не приходят.


#14

А вы регистрируете уведомления в сервисе уведомлений?


#15

использую локальные уведомления