2017-08-08 27 views
1

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

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

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

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

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

そして私はその後、私はこのようなリストを取得日8.この

開始日2017年8月23日の最終日の2017年9月1日及び番号などの別の日付を持っています。

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

私の問題である時々日付リストで間違った(第一のシナリオ)が、第2のシナリオでは正しい。

答えて

2

単純な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 
} 
3

あなたはそれを本当に複雑にしています。単純な日付クラスのメソッドを使って差分を作成し、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) 
} 
+0

感謝をあなたの終了日を取得する少しあれば、あなたの実装を変更することができます。この違いは何ですか? – user1960169

+2

1日の時間として86400秒を使用しないでください(DSTを考えてください) –

+0

@ MartinsRありがとう。コードを変更しました。 – Alan

関連する問題