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
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
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.
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
}
let nowDate = Date()
let endDate = Date().addingTimeInterval(12345678)
let string = String.getTimeComponentString(olderDate: nowDate, newerDate: endDate)!
print(nowDate)
print(endDate)
print(string)
Sortie