Je reçois le nombre de jours, la date de début et la date de fin d'un service. Je veux obtenir la liste de toutes les dates entre la date de début et la date de fin. Disons que ma date de début est 2017/08/15 et la date de fin est 2017/08/16 et le nombre de jours est 2.
Mais je reçois la liste des dates comme celle-ci.
##### CONVERTED STRING DATE 2017-08-16
##### CONVERTED STRING DATE 2017-08-17
##### CONVERTED STRING DATE 2017-08-18
Et j'ai une autre date comme celle-ci
Date de début 2017/08/23 date de fin 2017/09/01 et nombre de jours 8. puis je reçois la liste comme celle-ci.
##### CONVERTED STRING DATE 2017-08-24
##### CONVERTED STRING DATE 2017-08-25
##### CONVERTED STRING DATE 2017-08-28
##### CONVERTED STRING DATE 2017-08-29
##### CONVERTED STRING DATE 2017-08-30
##### CONVERTED STRING DATE 2017-08-31
##### CONVERTED STRING DATE 2017-09-01
Voici comment j'obtiens le tableau des dates
numberOfDates=Int(ceil(numOfDay))
//numberOfDates=numberOfDates-1
let arrayDates=self.generateDates(startDate: startDate, addbyUnit: .day, value: numberOfDates)
Voici comment ma méthode de calcul de date
internal func generateDates(startDate :Date?, addbyUnit:Calendar.Component, value : Int) -> [Date]
{
//print("####START DATE#######\(startDate)")
var calendar = Calendar.current
calendar.timeZone=TimeZone.current
var datesArray: [Date] = [Date] ()
for i in 0 ... value {
var addAmount:Int!
if(value==0)
{
addAmount=0
}
else
{
addAmount=1
}
if let newDate = calendar.date(byAdding: addbyUnit, value: i + addAmount, to: startDate!) {
let strDayName=self.getDayName(mydate: newDate)
if (strDayName != "Saturday" && strDayName != "Sunday")
{
datesArray.append(newDate)
}
}
}
return datesArray
}
Mon problème est parfois que la liste des dates est incorrecte (1er scénario) mais elle est correcte dans le 2ème scénario.
Une simple boucle while vous fournira ce dont vous avez besoin. Exemple:
func generateDates(startDate :Date?, addbyUnit:Calendar.Component, value : Int) -> [Date] {
var dates = [Date]()
var date = startDate!
let endDate = Calendar.current.date(byAdding: addbyUnit, value: value, to: date)!
while date < endDate {
date = Calendar.current.date(byAdding: addbyUnit, value: 1, to: date)!
dates.append(date)
}
return dates
}
Edit: Ou vous pouvez modifier légèrement votre implémentation si vous obtenez votre date de fin à l'avance
func generateDates(between startDate: Date?, and endDate: Date?, byAdding: Calendar.Component) -> [Date] {
var dates = [Date]()
guard var date = startDate, let endDate = endDate else {
return []
}
while date < endDate {
date = Calendar.current.date(byAdding: byAdding, value: 1, to: date)!
dates.append(date)
}
return dates
}
Vous le rendez vraiment compliqué. Utilisez simplement des méthodes de classe de date simples pour la différence et générez de nouvelles dates avec une boucle for et une classe Calendar.
let startDate = Date()
let endDate = Date(timeInterval: 2*86400, since: startDate)
let components = Calendar.current.dateComponents([.day], from: startDate, to: endDate)
let numberOfDays = components.day ?? 0
for i in 1...numberOfDays {
let nextDate = Calendar.current.date(byAdding: .day, value: i, to: startDate)
print(nextDate)
}