2017-02-08 11 views
2

Хорошо, у меня есть let date = Date() в Swift 3, и мне нужно получить список ближайших часов кварталов.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 вечера

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

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) 
    } 
+0

Пожалуйста, покажите, что вы пытались – shallowThought

+0

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

+0

Пожалуйста, смотрите мою EDIT 1, не уверен, что можно записать в более но по крайней мере он работает так, как ожидалось. –

ответ

2

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

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

// 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 
+0

Ver хорошо. Спасибо @ Noyer282! –