Difference between 2 dates in weeks and days using swift 3 and xcode 8

前端 未结 4 2008
情话喂你
情话喂你 2020-12-05 02:13

I am trying to calculate the difference between 2 dates (one is the current date and the other from datepicker) in weeks and days then displaying the result on a label, that

相关标签:
4条回答
  • 2020-12-05 02:51

    Swift 4,5

    You can find date different in weeks with this one line code.

    let totalWeeks = Calendar.current.dateComponents([.weekOfMonth], from: Date(), to: endDate).weekOfMonth!
    
    //for totalDays
    let totalDays = Calendar.current.dateComponents([.day], from: Date(), to: endDate).day!
    
    0 讨论(0)
  • 2020-12-05 02:58

    Swift 4

    testing using Xcode Version 9.2

    • combining the above two answers that helps me

    Use the following method to get the string by the difference between two dates the idea is to localize the words weeks/ days /minutes by the format.

    func getTimeComponentString(olderDate older: Date,newerDate newer: Date) -> (String?)  {
        let formatter = DateComponentsFormatter()
        formatter.unitsStyle = .full
    
        let componentsLeftTime = Calendar.current.dateComponents([.minute , .hour , .day,.month, .weekOfMonth,.year], from: older, to: newer)
    
        let year = componentsLeftTime.year ?? 0
        if  year > 0 {
            formatter.allowedUnits = [.year]
            return formatter.string(from: older, to: newer)
        }
    
    
        let month = componentsLeftTime.month ?? 0
        if  month > 0 {
            formatter.allowedUnits = [.month]
            return formatter.string(from: older, to: newer)
        }
    
        let weekOfMonth = componentsLeftTime.weekOfMonth ?? 0
        if  weekOfMonth > 0 {
            formatter.allowedUnits = [.weekOfMonth]
            return formatter.string(from: older, to: newer)
        }
    
        let day = componentsLeftTime.day ?? 0
        if  day > 0 {
            formatter.allowedUnits = [.day]
            return formatter.string(from: older, to: newer)
        }
    
        let hour = componentsLeftTime.hour ?? 0
        if  hour > 0 {
            formatter.allowedUnits = [.hour]
            return formatter.string(from: older, to: newer)
        }
    
        let minute = componentsLeftTime.minute ?? 0
        if  minute > 0 {
            formatter.allowedUnits = [.minute]
            return formatter.string(from: older, to: newer) ?? ""
        }
    
        return nil
    }
    

    Here is how you can use

        let nowDate = Date()
        let endDate = Date().addingTimeInterval(12345678)
    
        let string =  String.getTimeComponentString(olderDate: nowDate, newerDate: endDate)!
        print(nowDate)
        print(endDate)
        print(string)
    
    • Output

    • 2018-03-08 08:11:22 +0000
    • 2018-07-29 05:32:41 +0000
    • 4 months
    0 讨论(0)
  • 2020-12-05 03:01

    You can use Calendar's dateComponents(_:from:to:) to find the difference between 2 dates to your desired units.

    Example:

    let dateRangeStart = Date()
    let dateRangeEnd = Date().addingTimeInterval(12345678)
    let components = Calendar.current.dateComponents([.weekOfYear, .month], from: dateRangeStart, to: dateRangeEnd)
    
    print(dateRangeStart)
    print(dateRangeEnd)
    print("difference is \(components.month ?? 0) months and \(components.weekOfYear ?? 0) weeks")
    
    
    > 2017-02-17 10:05:19 +0000
    > 2017-07-10 07:26:37 +0000
    > difference is 4 months and 3 weeks
    
    let months = components.month ?? 0
    let weeks = components.weekOfYear ?? 0
    
    0 讨论(0)
  • 2020-12-05 03:13

    You are close. Just add .weekOfMonth (meaning "quantity of weeks" according to the API documentation) to the allowed units. Example:

    let now = Date()
    let endDate = now.addingTimeInterval(24 * 3600 * 17)
    
    let formatter = DateComponentsFormatter()
    formatter.allowedUnits = [.day, .weekOfMonth]
    formatter.unitsStyle = .full
    let string = formatter.string(from: now, to: endDate)!
    
    print(string) // 2 weeks, 3 days
    

    Setting maximumUnitCount = 2 is not necessary because there are only two allowed units.

    0 讨论(0)
提交回复
热议问题