35 votes

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

Je essaie de calculer la différence entre 2 dates (une est la date actuelle et l'autre du datepicker) en semaines et jours puis afficher le résultat sur une étiquette, voilà 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

0 votes

Hey FormulaOne.... Veuillez consulter cette réponse stackoverflow.com/questions/27182023/…

0 votes

Il serait utile d'améliorer la question si vous expliquiez en quoi votre code actuel (qui est correct dans la mesure du possible) ne donne pas le résultat souhaité.

0 votes

A tout a sens car cela vous ferait gagner du temps de me trouver une réponse la prochaine fois! :)

60voto

Ashley Mills Points 10205

Vous pouvez utiliser dateComponents(_:from:to:) de Calendar pour trouver la différence entre 2 dates dans les 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("la différence est de \(components.month ?? 0) mois et \(components.weekOfYear ?? 0) semaines")

> 2017-02-17 10:05:19 +0000
> 2017-07-10 07:26:37 +0000
> la différence est de 4 mois et 3 semaines

let months = components.month ?? 0
let weeks = components.weekOfYear ?? 0

0 votes

Merci pour votre aide, la première solution a parfaitement fonctionné pour moi :)

0 votes

Juste ce que je voulais vraiment était la différence entre les dates en jours (ou semaines) puis je peux utiliser cette différence pour faire un calcul, ce que je reçois de votre solution est une chaîne sur laquelle je ne peux pas effectuer de calculs, Merci

0 votes

Si vous regardez comment la chaîne est construite, vous verrez les components.month et components.weekOfYear ce sont des valeurs de type Int

12voto

Martin R Points 105727

Vous êtes proche. Il suffit d'ajouter .weekOfMonth (signifiant "quantité de semaines" selon la documentation de l'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 semaines, 3 jours

Il n'est pas nécessaire de définir maximumUnitCount = 2 car il n'y a que deux unités autorisées.

0 votes

D'accord, ce que je voulais vraiment était la différence entre les dates en jours (ou semaines) puis je peux utiliser cette différence pour faire un calcul, ce que j'obtiens de votre solution est une chaîne sur laquelle je ne peux pas faire de calculs, Merci

1 votes

@Formule1: Eh bien, ce n'était pas apparent de votre question. Vous avez dit "... puis afficher le résultat sur une étiquette... " ce qui signifie que vous voulez une chaîne de caractères. - Si vous avez besoin de la différence en tant que numéros, utilisez DateComponents comme suggéré dans la réponse d'Ashley.

5voto

Swift 4

test en utilisant Xcode Version 9.2

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

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 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

2voto

Swift 4,5

Vous pouvez trouver la différence de date en semaines avec cette ligne de code.

let totalWeeks = Calendar.current.dateComponents([.weekOfMonth], from: Date(), to: endDate).weekOfMonth!

//pour les jours totaux
let totalDays = Calendar.current.dateComponents([.day], from: Date(), to: endDate).day!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X