Swift 4.2如何正确检查经过的时间

时间:2019-03-20 18:01:51

标签: swift nsdate nsdateformatter

在从服务器下载/操作某些数据之前,我需要检查日期。假设只有24小时或更长时间,我才需要这样做。该代码似乎可以正常工作,但是我不确定,没有办法用更少的代码行吗?对我来说似乎太久了。我检查了this,但解决方案与我的完全不同。

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 :(得分:0)

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")
}

答案 1 :(得分:0)

快速扩展功能可以简化它:

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")
}

答案 2 :(得分:0)

您实际上可以为此使用扩展名。它将返回所需的日历组件

扩展

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