2017-10-20 125 views
1

我正在構建一個Swift習慣建設應用程序。在某個時刻,用戶選擇他們想要創建的習慣的持續時間(以天計)。用戶還可以選擇他們想要練習的星期幾(星期日,星期一,星期二等)。開始日期是他們創造習慣的那一天。在Swift中迭代日期範圍的最有效方法是什麼?

我目前有開始日期和結束日期(根據用戶選擇的天數)。但是,在該日期範圍內,我需要提取用戶選擇的特定日期的日期。

我的想法是,對於時間間隔(startDate,endDate)中的每個週日值'x',返回日曆日期。然而,我試圖創建一個DateInterval,我無法迭代它,因爲它不符合協議'序列'。

是否有一種迭代此日期範圍並提取這些其他日期的有效方法?有沒有更好的方式,我還沒有想到?

這裏是我當前的日期啓動下面的代碼:

var date = Date() 
var duration = 10 
let calendar = Calendar.current 

let dateEnding = Calendar.current.date(byAdding: .day, value: duration, to: date as Date)! 

//Returns a number representing day of the week. i.e. 1 = Sunday 
let weekDay = calendar.component(.weekday, from: date) 


//Initializing a time interval, based on user selected duration and start date 
let timeInterval = DateInterval.init(start: date, end: dateEnding) 

感謝您的幫助......

回答

2

如果我正確理解你的問題,用戶將檢查關閉某些工作日並提供一段時間作爲天數。

假設你已經在陣列中和的持續時間所選擇的平日,就可以得到匹配的日期列表如下:

// User selected weekdays (1 = Sunday, 7 = Saturday) 
var selectedWeekdays = [2, 4, 6] // Example - Mon, Wed, Fri 
var duration = 10 // Example - 10 days 

let calendar = Calendar.current 
var today = Date() 
let dateEnding = calendar.date(byAdding: .day, value: duration, to: today)! 

var matchingDates = [Date]() 
// Finding matching dates at midnight - adjust as needed 
let components = DateComponents(hour: 0, minute: 0, second: 0) // midnight 
calendar.enumerateDates(startingAfter: today, matching: components, matchingPolicy: .nextTime) { (date, strict, stop) in 
    if let date = date { 
     if date <= dateEnding { 
      let weekDay = calendar.component(.weekday, from: date) 
      print(date, weekDay) 
      if selectedWeekdays.contains(weekDay) { 
       matchingDates.append(date) 
      } 
     } else { 
      stop = true 
     } 
    } 
} 

print("Matching dates = \(matchingDates)") 
+0

輝煌 - 它完美的工作。謝謝!!! – sharedev

1

試試這個

let calendar = NSCalendar.currentCalendar() 
let startDate = ... 
let endDate = ... 
let dateRange = calendar.dateRange(startDate: startDate, 
            endDate: endDate, 
            stepUnits: .Day, 
            stepValue: 1) 

for date in dateRange { 
    print("It's \(date)!") 
} 
+1

這是夫特2代碼。爲什麼? Swift 2早已不復存在。 Swift 4是當前版本。 – rmaddy

+0

遺憾的是dateRange已經被棄用,並且不再適用於Swift 4. – sharedev

相關問題