Swift 3 - find number of calendar days between two dates

前端 未结 11 2075
别跟我提以往
别跟我提以往 2020-12-12 23:51

The way I did this in Swift 2.3 was:

let currentDate         = NSDate()
let currentCalendar     = NSCalendar.currentCalendar()

var startDate : NSDate?
var e         


        
11条回答
  •  悲哀的现实
    2020-12-13 00:06

    If any one want to do it more specifically follow Below Steps

    1.Add this Date Extension

    extension Date {
        /// Returns the amount of years from another date
    func years(from date: Date) -> Int {
        return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0
    }
    /// Returns the amount of months from another date
    func months(from date: Date) -> Int {
        return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0
    }
    /// Returns the amount of weeks from another date
    func weeks(from date: Date) -> Int {
        return Calendar.current.dateComponents([.weekOfMonth], from: date, to: self).weekOfMonth ?? 0
    }
    /// Returns the amount of days from another date
    func days(from date: Date) -> Int {
        return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
    }
    /// Returns the amount of hours from another date
    func hours(from date: Date) -> Int {
        return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0
    }
    /// Returns the amount of minutes from another date
    func minutes(from date: Date) -> Int {
        return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0
    }
    /// Returns the amount of seconds from another date
    func seconds(from date: Date) -> Int {
        return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0
    }
    /// Returns the amount of nanoseconds from another date
    func nanoseconds(from date: Date) -> Int {
        return Calendar.current.dateComponents([.nanosecond], from: date, to: self).nanosecond ?? 0
    }
    /// Returns the a custom time interval description from another date
    func offset(from date: Date) -> String {
        var result: String = ""
                if years(from: date)   > 0 { return "\(years(from: date))y"   }
                if months(from: date)  > 0 { return "\(months(from: date))M"  }
                if weeks(from: date)   > 0 { return "\(weeks(from: date))w"   }
        if seconds(from: date) > 0 { return "\(seconds(from: date))" }
                if days(from: date)    > 0 { result = result + " " + "\(days(from: date)) D" }
                if hours(from: date)   > 0 { result = result + " " + "\(hours(from: date)) H" }
                if minutes(from: date) > 0 { result = result + " " + "\(minutes(from: date)) M" }
               if seconds(from: date) > 0 { return "\(seconds(from: date))" }
        return ""
     }
    }
    

    2.Define it in globally

     fileprivate var timer: Timer?
    

    3.Call this Method in viewDidLoad or where ever you want

    override func viewDidLoad() {
        super.viewDidLoad()
        self.getRemainingTime()
    } 
    

    4.Usage

    fileprivate func getRemainingTime() {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    
        let startDate = "2018-06-02 10:11:12"
        let currentDate = dateFormatter.string(from: Date())
    
        if currentDate != startDate {
            timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(calculateTime)), userInfo: nil, repeats: true)
            RunLoop.current.add(timer!, forMode: RunLoopMode.commonModes)
            timer?.fire()
        }
        else {
            self.timer?.invalidate()
            self.timer = nil
        }
    }
    
    func calculateTime() {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    
        let stdate : String = "2018-06-02 10:11:12"
        let startDate = dateFormatter.date(from: stdate)!
    
        let currentDate = Date()
    
        let strTimer : String = startDate.offset(from: currentDate)
        if !strTimer.isEmpty {
            let stDay: String = "\((Int(strTimer)! % 31536000) / 86400)"
            let stHour: String = "\((Int(strTimer)! % 86400) / 3600)"
            let stMin: String = "\((Int(strTimer)! % 3600) / 60)"
            let stSec: String = "\(Int(strTimer)! % 60)"
            yourLabelOutlet.text = "Start In :\(stDay) Days \(stHour) Hours \(stMin) Minutes \(stSec) Seconds"
        }
    
    }
    

    Works like Charm You can Use every separate string to your UI Side, Enjoy

提交回复
热议问题