Search code examples
swiftswift3

Get array of dates for hours, days, weeks, months between current date/time and end date/time


I want to create a range of Date objects using Swift 3 and was wondering if there is an API somewhere that simplifies what I want to do, for example:

One of the things I want to do is produce a range of Dates for the period of 1 year (January through December), each Date representing the 1st of every month.

I know I can do all this within a loop like so...

func monthsInYear() {
   var calendar = Calendar.current
   let date = Date()
   let monthsOfYearRange = calendar.range(of: .month, in: .year, for: date)
   print(monthsOfYearRange as Any)

  if let monthsOfYearRange = monthsOfYearRange {
      let year = calendar.component(.year, from: date)

      for monthOfYear in (monthsOfYearRange.lowerBound..<monthsOfYearRange.upperBound) {
         let components = DateComponents(year: year, month: monthOfYear)
         guard let date = Calendar.current.date(from: components) else { continue }
         print(date.description(with: Locale.current))
      }
   }
}

Which produces the following output...

Sunday, January 1, 2017 at 12:00:00 AM Eastern Standard Time
Wednesday, February 1, 2017 at 12:00:00 AM Eastern Standard Time
Wednesday, March 1, 2017 at 12:00:00 AM Eastern Standard Time
Saturday, April 1, 2017 at 12:00:00 AM Eastern Daylight Time
Monday, May 1, 2017 at 12:00:00 AM Eastern Daylight Time
Thursday, June 1, 2017 at 12:00:00 AM Eastern Daylight Time
Saturday, July 1, 2017 at 12:00:00 AM Eastern Daylight Time
Tuesday, August 1, 2017 at 12:00:00 AM Eastern Daylight Time
Friday, September 1, 2017 at 12:00:00 AM Eastern Daylight Time
Sunday, October 1, 2017 at 12:00:00 AM Eastern Daylight Time
Wednesday, November 1, 2017 at 12:00:00 AM Eastern Daylight Time
Friday, December 1, 2017 at 12:00:00 AM Eastern Standard Time

However, what I'm looking for is an easier more concise way to do this. I want to do the same for weeks in a given month, days within a given week, hours within a given day which I am able to do, but it uses the same loop.


Solution

  • This is what I went with - stuck with "the loop" :S

    func monthsInYear() {
       print()
       print("monthsInYear")
    
       var calendar = Calendar.current
       let date = Date()
       let monthsOfYearRange = calendar.range(of: .month, in: .year, for: date)
       //print(monthsOfYearRange as Any)
    
      if let monthsOfYearRange = monthsOfYearRange {
          let year = calendar.component(.year, from: date)
    
          for monthOfYear in (monthsOfYearRange.lowerBound..<monthsOfYearRange.upperBound) {
             let components = DateComponents(year: year, month: monthOfYear)
             guard let date = Calendar.current.date(from: components) else { continue }
             print(date.description(with: Locale.current))
          }
       }
    }
    
    func weeksInMonths() {
       print()
       print("weeksInMonths")
    
       var calendar = Calendar.current
       let date = Date()
       let weekOfYearRange = calendar.range(of: .weekOfYear, in: .month, for: date)
       //print(weekOfYearRange as Any)
    
       if let weekOfYearRange = weekOfYearRange {
          let year = calendar.component(.year, from: date)
    
          for weekOfYear in (weekOfYearRange.lowerBound..<weekOfYearRange.upperBound) {
             let components = DateComponents(weekOfYear: weekOfYear, yearForWeekOfYear: year)
             guard let date = Calendar.current.date(from: components) else { continue }
             print(date.description(with: Locale.current))
          }
       }
    }
    
    func daysInWeek() {
       print()
       print("daysInWeek")
    
       var calendar = Calendar.current
       let date = Date()
       let daysInWeekRange = calendar.range(of: .day, in: .weekOfMonth, for: date)
       //print(daysInWeekRange as Any)
    
       if let daysInWeekRange = daysInWeekRange {
          let year = calendar.component(.year, from: date)
          let month = calendar.component(.month, from: date)
          let weekOfMonth = calendar.component(.weekOfMonth, from: date)
    
          for dayOfWeek in (daysInWeekRange.lowerBound..<daysInWeekRange.upperBound) {
             let components = DateComponents(month: month, day: dayOfWeek, weekOfMonth: weekOfMonth)
             guard let date = Calendar.current.date(from: components) else { continue }
             print(date.description(with: Locale.current))
          }
       }
    }
    
    func hoursInDay() {
       print()
       print("hoursInDay")
    
       var calendar = Calendar.current
       let date = Date()
       let hoursInDayRange = calendar.range(of: .hour, in: .day, for: date)
       //print(hoursInDayRange as Any)
    
       if let hoursInDayRange = hoursInDayRange {
          let year = calendar.component(.year, from: date)
          let month = calendar.component(.month, from: date)
          let weekOfMonth = calendar.component(.weekOfMonth, from: date)
          let day = calendar.component(.day, from: date)
    
          for hourOfDay in (hoursInDayRange.lowerBound..<hoursInDayRange.upperBound) {
             let components = DateComponents(year: year, month: month, day: day, hour: hourOfDay, weekOfMonth: weekOfMonth)
             guard let date = Calendar.current.date(from: components) else { continue }
             print(date.description(with: Locale.current))
          }
       }
    }
    

    Which produces the following output when run:

    monthsInYear
    Sunday, January 1, 2017 at 12:00:00 AM Eastern Standard Time
    Wednesday, February 1, 2017 at 12:00:00 AM Eastern Standard Time
    Wednesday, March 1, 2017 at 12:00:00 AM Eastern Standard Time
    Saturday, April 1, 2017 at 12:00:00 AM Eastern Daylight Time
    Monday, May 1, 2017 at 12:00:00 AM Eastern Daylight Time
    Thursday, June 1, 2017 at 12:00:00 AM Eastern Daylight Time
    Saturday, July 1, 2017 at 12:00:00 AM Eastern Daylight Time
    Tuesday, August 1, 2017 at 12:00:00 AM Eastern Daylight Time
    Friday, September 1, 2017 at 12:00:00 AM Eastern Daylight Time
    Sunday, October 1, 2017 at 12:00:00 AM Eastern Daylight Time
    Wednesday, November 1, 2017 at 12:00:00 AM Eastern Daylight Time
    Friday, December 1, 2017 at 12:00:00 AM Eastern Standard Time
    
    weeksInMonths
    Sunday, November 26, 2017 at 12:00:00 AM Eastern Standard Time
    Sunday, December 3, 2017 at 12:00:00 AM Eastern Standard Time
    Sunday, December 10, 2017 at 12:00:00 AM Eastern Standard Time
    Sunday, December 17, 2017 at 12:00:00 AM Eastern Standard Time
    Sunday, December 24, 2017 at 12:00:00 AM Eastern Standard Time
    Sunday, December 31, 2017 at 12:00:00 AM Eastern Standard Time
    
    daysInWeek
    Monday, December 10, 1 at 12:00:00 AM GMT-04:56:02
    Tuesday, December 11, 1 at 12:00:00 AM GMT-04:56:02
    Wednesday, December 12, 1 at 12:00:00 AM GMT-04:56:02
    Thursday, December 13, 1 at 12:00:00 AM GMT-04:56:02
    Friday, December 14, 1 at 12:00:00 AM GMT-04:56:02
    Saturday, December 15, 1 at 12:00:00 AM GMT-04:56:02
    Sunday, December 16, 1 at 12:00:00 AM GMT-04:56:02
    
    hoursInDay
    Tuesday, December 12, 2017 at 12:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 1:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 2:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 3:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 4:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 5:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 6:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 7:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 8:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 9:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 10:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 11:00:00 AM Eastern Standard Time
    Tuesday, December 12, 2017 at 12:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 1:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 2:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 3:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 4:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 5:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 6:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 7:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 8:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 9:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 10:00:00 PM Eastern Standard Time
    Tuesday, December 12, 2017 at 11:00:00 PM Eastern Standard Time