Swift days between two NSDates

后端 未结 27 1205
清歌不尽
清歌不尽 2020-11-27 13:30

I\'m wondering if there is some new and awesome possibility to get the amount of days between two NSDates in Swift / the \"new\" Cocoa?

E.g. like in Ruby I would do:

相关标签:
27条回答
  • 2020-11-27 13:41

    Here is my answer for Swift 3:

    func daysBetweenDates(startDate: NSDate, endDate: NSDate, inTimeZone timeZone: TimeZone? = nil) -> Int {
        var calendar = Calendar.current
        if let timeZone = timeZone {
            calendar.timeZone = timeZone
        }
        let dateComponents = calendar.dateComponents([.day], from: startDate.startOfDay, to: endDate.startOfDay)
        return dateComponents.day!
    }
    
    0 讨论(0)
  • 2020-11-27 13:42

    This returns an absolute difference in days between some Date and today:

    extension Date {
      func daysFromToday() -> Int {
        return abs(Calendar.current.dateComponents([.day], from: self, to: Date()).day!)
      }
    }
    

    and then use it:

    if someDate.daysFromToday() >= 7 {
      // at least a week from today
    }
    
    0 讨论(0)
  • 2020-11-27 13:42

    Nice handy one liner :

    extension Date {
      var daysFromNow: Int {
        return Calendar.current.dateComponents([.day], from: Date(), to: self).day!
      }
    }
    
    0 讨论(0)
  • 2020-11-27 13:45

    Swift 3. Thanks to Emin Buğra Saral above for the startOfDay suggestion.

    extension Date {
    
        func daysBetween(date: Date) -> Int {
            return Date.daysBetween(start: self, end: date)
        }
    
        static func daysBetween(start: Date, end: Date) -> Int {
            let calendar = Calendar.current
    
            // Replace the hour (time) of both dates with 00:00
            let date1 = calendar.startOfDay(for: start)
            let date2 = calendar.startOfDay(for: end)
    
            let a = calendar.dateComponents([.day], from: date1, to: date2)
            return a.value(for: .day)!
        }
    }
    

    Usage:

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let start = dateFormatter.date(from: "2017-01-01")!
    let end = dateFormatter.date(from: "2018-01-01")!
    
    let diff = Date.daysBetween(start: start, end: end) // 365
    
    0 讨论(0)
  • 2020-11-27 13:45
      func completeOffset(from date:Date) -> String? {
    
        let formatter = DateComponentsFormatter()
        formatter.unitsStyle = .brief
    
        return  formatter.string(from: Calendar.current.dateComponents([.year,.month,.day,.hour,.minute,.second], from: date, to: self))
    
    
    
    
    }
    

    if you need year month days and hours as string use this

    var tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: Date())!

    let dc = tomorrow.completeOffset(from: Date())

    0 讨论(0)
  • 2020-11-27 13:46

    Swift 5

    Working, you need to set the time to be the same for both days, if you are off by seconds it will be wrong

    func daysBetween(start: Date, end: Date) -> Int {
        let start = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: start)!
        let end = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: end)!
        return Calendar.current.dateComponents([.day], from: start, to: end).day ?? 0
    }
    
    0 讨论(0)
提交回复
热议问题