Différence entre 2 dates en semaines et jours en utilisant swift 3 et xcode 8

j'essaye de calculer la différence entre 2 dates (une est la date actuelle et l'autre de datepicker) en semaines et jours, puis l'affichage du résultat sur une étiquette, c'est ce que j'ai fait jusqu'à présent, j'apprécie l'aide de développeurs plus expérimentés ici!

let EDD = datePicker.date
let now = NSDate()

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .short
formatter.allowedUnits = [.day]
formatter.maximumUnitCount = 2   

let string = formatter.string (from: now as Date, to: EDD)

label.text = string
20
demandé sur Ashley Mills 2017-02-17 12:59:46

3 réponses

Vous pouvez utiliser CalendardateComponents(_:from:to:) pour trouver la différence entre 2 dates à vos unités désirées.

Exemple:

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
36
répondu Ashley Mills 2017-02-17 12:11:41

vous êtes proche. Juste ajouter .weekOfMonth(ce qui signifie " nombre de semaines" selon la documentation API) aux unités autorisées. Exemple:

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

9
répondu Martin R 2017-02-17 10:17:13

Swift 4

test en utilisant Xcode Version 9.2

  • en combinant les deux réponses qui m'aide

utilisez la méthode suivante pour obtenir la chaîne par la différence entre deux dates l'idée est de localiser les mots semaines/ jours /minutes par le 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
}

Voici comment utiliser

    let nowDate = Date()
    let endDate = Date().addingTimeInterval(12345678)

    let string =  String.getTimeComponentString(olderDate: nowDate, newerDate: endDate)!
    print(nowDate)
    print(endDate)
    print(string)
  • Sortie

  • 2018-03-08 08:11:22 +0000
  • 2018-07-29 05:32:41 +0000
  • 4 mois
2
répondu Amr Angry 2018-03-08 08:20:47