サービスから日数、開始日、終了日を取得しています。開始日と終了日の間のすべての日付のリストを取得したい。開始日が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番目のシナリオでは正しいです。
単純な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
}
あなたはそれを本当に複雑にしています。違いのために単純な日付クラスのメソッドを使用し、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)
}