swift 3 получение списка ближайших часовых кварталов


Хорошо, у меня есть let date = Date() в Swift 3, и мне нужно получить список ближайших часовых кварталов.

Допустим, текущая дата равна 2017-02-08 15:24:56 +0000 , так что желаемый список будет

2017-02-08 15:30:00 +0000
2017-02-08 15:45:00 +0000
2017-02-08 16:00:00 +0000

Как я могу получить этот список дат?

EDIT 1 2/8/2017 5: 54 PM

Вот то, что я только что пытался сделать, и похоже, что это даст нужные мне результаты.

    let currentDate = Date()
    var minute = Calendar.current.component(.minute, from: currentDate)

    if minute < 15 {
        minute = 15
    } else if minute < 30 {
        minute = 30
    } else if minute < 45 {
        minute = 45
    } else {
        minute = 0
    }

    var hourQuarterDate = Calendar.current.nextDate(after: currentDate, matching: DateComponents(minute: minute), matchingPolicy: .strict, repeatedTimePolicy: .first, direction: .forward)!

    var hourQuarters = [Date]()
    hourQuarters.append(hourQuarterDate)

    for _ in 1...10 {
        hourQuarterDate = Calendar.current.date(byAdding: .minute, value: 15, to: hourQuarterDate)!
        hourQuarters.append(hourQuarterDate)
    }
1 2

1 ответ:

Ваша правка была полезной. Вот небольшая вариация, которую я реализовал на ее основе.

Мой главный шаг-округлить текущую дату до последней четверти часа:

// Parameters
let minuteGranuity = 15
let numberOfDates = 4

// Find current date and date components
let now = Date()                                   
//2017-03-06 13:23:40 +0000
let calendar = Calendar.current
let hour = calendar.component(.hour, from: now)
let minute = calendar.component(.minute, from: now)

// Round down to nearest date:
let floorMinute = minute - (minute % minuteGranuity)
let floorDate = calendar.date(bySettingHour: hour, 
                              minute: floorMinute, 
                              second: 0, 
                              of: now)!

, как в вашем редактирования, я использую "дата(byAdding:" метод, чтобы добавить 15-минутные интервалы, что дата основания:

var dates: [Date] = []
for minutes in stride(from: minuteGranuity, through: minuteGranuity*numberOfDates, by: minuteGranuity) {
    let newDate = calendar.date(byAdding: .minute, value: minutes, to: floorDate)!
    dates.append(newDate)
}

for date in dates {
    print(date)
}

// 2017-03-06 13:30:00 +0000
// 2017-03-06 13:45:00 +0000
// 2017-03-06 14:00:00 +0000
// 2017-03-06 14:15:00 +0000