2017-08-08 85 views
1

我從服務中獲取天數,開始日期和結束日期。我想獲取開始日期和結束日期之間的所有日期列表。假設我的開始日期爲2017/08/15,結束日期爲2017/08/16,天數爲2.如何在swift中將日期添加到日期3

但是我正在獲取像這樣的日期列表。

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

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

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

而且我有這樣

開始日期2017年8月23日結束日期2017年9月1日和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 
} 

我的問題是有時日期列表是錯誤的(第一方案),但它在第二種情況下是正確的。

回答

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

不要使用86400秒作爲一天的持續時間(想想DST) –

+0

@MartinR thanks.I改變了代碼。 – Alan