web-dev-qa-db-ja.com

Swift 3で日付に日を追加する方法

サービスから日数、開始日、終了日を取得しています。開始日と終了日の間のすべての日付のリストを取得したい。開始日が2017/08/15、終了日が2017/08/16、日数が2であるとします。

しかし、私はこのような日付リストを取得しています。

##### CONVERTED STRING DATE 2017-08-16

##### CONVERTED STRING DATE  2017-08-17

##### CONVERTED STRING DATE 2017-08-18

そして、私はこのような別の日付を持っています

開始日2017/08/23終了日2017/09/01および日数8.次に、このようなリストを取得します。

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

これは私が日付配列を取得する方法です

 numberOfDates=Int(ceil(numOfDay))
                        //numberOfDates=numberOfDates-1
                        let arrayDates=self.generateDates(startDate: startDate, addbyUnit: .day, value: numberOfDates)

これが私の日付計算方法です

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
}

私の問題は、日付リストが間違っている場合がありますが(1番目のシナリオ)、2番目のシナリオでは正しいです。

11
user1960169

単純なwhileループは、必要なものを取得します。例:

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
}

編集:または、事前に終了日を取得する場合は、実装をわずかに変更できます

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

あなたはそれを本当に複雑にしています。違いのために単純な日付クラスのメソッドを使用し、forループと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