web-dev-qa-db-fra.com

Différence entre 2 dates en semaines et en jours avec Swift 3 et xcode 8

J'essaie de calculer la différence entre 2 dates (l'une est la date actuelle et l'autre de datepicker) en semaines et en jours, puis en affichant le 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
31
FormulaOne

Vous pouvez utiliser Calendar's dateComponents(_:from:to:) pour trouver la différence entre 2 dates et vos unités souhaité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
53
Ashley Mills

Tu es proche. Ajoutez simplement .weekOfMonth (signifiant "nombre de semaines" selon la documentation de l'API) en 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

Réglage maximumUnitCount = 2 n'est pas nécessaire car il n'y a que deux unités autorisées.

12
Martin R

Swift 4

tester à l'aide de Xcode version 9.2

  • combinant les deux réponses ci-dessus qui m'aide

Utilisez la méthode suivante pour obtenir la chaîne en fonction de la différence entre deux dates. L’idée est de localiser les mots semaines/jours/minutes en fonction du 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 vous pouvez 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
4
Amr Angry