swift 4.2 как правильно проверить прошедшее время - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно проверить дату, прежде чем загружать / манипулировать некоторыми данными с сервера.Допустим, мне нужно сделать это, только если прошло 24 часа или больше.этот код, кажется, работает, но я не уверен в этом, нет способа сделать это с меньшим количеством строк кода?это кажется слишком длинным для меня.Я проверил это , но решения сильно отличаются от моих.

import UIKit


//standard day formatter
let dateFormatter = DateFormatter()



//let's say this is the date I saved last time i updated data from online server:
let previousDate: String = "2019-03-19 06:40 PM"
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm a"
let old = dateFormatter.date(from: previousDate)

//today I try to download data
let today = Date()

//this simply tests if "moment before" is greater than "moment after"
if today > old! {
    print("update data")
} else {
    print("do not update")
}




//here I create a measure
let minute:TimeInterval = 60.0
let hour:TimeInterval = 60.0 * minute
let day:TimeInterval = 24 * hour

//here I measure if the old date added of 24h is greater than now, in that case a day or more is passed and I can update
let theOldDateMore24h = Date(timeInterval: day, since: old!)

if theOldDateMore24h < today {
    print("passed more than a day: Update!")
} else {
    print("less than a day, do not update")
}

Ответы [ 3 ]

0 голосов
/ 20 марта 2019

Функция быстрого расширения для упрощения:

extension Date {
    func isWithin(_ distanceTime: TimeInterval, after laterDate: Date) -> Bool{
        let distance = timeIntervalSince(laterDate)
        let result = distanceTime >= distance
        return result
    }
}

//Usage
let secondsInDay = TimeInterval(60 * 60 * 24)
let isUpToDate = Date().isWithin(secondsInDay, after: previousDate)

if !isUpToDate {
    print("passed more than a day: Update!")
}
else {
    print("less than a day, do not update")
}
0 голосов
/ 20 марта 2019

Вы можете использовать расширение для этого.Будет возвращен необходимый компонент календаря

Расширение

extension Date {

    func interval(ofComponent comp: Calendar.Component, fromDate date: Date) -> Int {

        let currentCalendar = Calendar.current

        guard let start = currentCalendar.ordinality(of: comp, in: .era, for: date) else { return 0 }
        guard let end = currentCalendar.ordinality(of: comp, in: .era, for: self) else { return 0 }

        return end - start
    }
}

Использование

let yesterday = Date(timeInterval: -86400, since: Date())
let tomorrow = Date(timeInterval: 86400, since: Date())

// Change the component to your preference
let difference = tomorrow.interval(ofComponent: .day, fromDate: yesterday) // returns 2
0 голосов
/ 20 марта 2019

Существует метод в Calendar

func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponents


Получить компонент day и проверить значение больше 0

let dateFormatter = DateFormatter()
let previousDate = "2019-03-19 06:40 PM"
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm a"
let old = dateFormatter.date(from: previousDate)

//today I try to download data
let today = Date()

if let validDate = old, Calendar.current.dateComponents([.day], from: validDate, to: today).day! > 0 {
    print("passed more than a day: Update!")
} else {
    print("less than a day, do not update")
}
...