web-dev-qa-db-fra.com

Comment ajouter des jours à une date en Swift 3

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.

11
user1960169

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
}
15
nayem

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)
}
18
Alan