Как я могу генерировать каждую дату между двумя датами с заданной гранулярностью? - PullRequest
0 голосов
/ 17 января 2019

Как я могу сгенерировать каждую дату между двумя датами с заданной гранулярностью?

Я хочу сделать эту дополнительную площадку массивом дат, которые должны быть на 00, 15, 30 или 45 м, чтобы не было пробелов. При желании можно установить начальную и конечную даты, которых не было в исходном наборе (поэтому можно указывать даты начала и окончания).

extension TimeSeries {
    var earliest: Date? {
        return timeSeries.map { $0.date }.min()
    }
    var latest: Date? {
        return timeSeries.map { $0.date }.max()

    }
    func pad (to repletion: Int, _ component: Calendar.Component, from: Date? = nil, to: Date? = nil) {
        guard let start = from ?? self.earliest else {
            print("no start date given and none available")
            return
        }
        guard let end = to ?? self.latest else {
            print("no end date given and none available")
            return
        }

        // magic happens here...
    }
}

В частности, учитывая:

[ Date/* 2018-01-16 01:15:00 */, Date/* 2018-01-16 01:45:00 */]

Я хочу, чтобы массив стал:

[ Date/* 2018-01-16 01:15:00 */,  Date/* 2018-01-16 01:30:00 */, Date/* 2018-01-16 01:45:00 */]

А если бы он назывался как ts.pad(to: 15, .minutes, from: Date/* 2018-01-16 01:00:00 */, to: Date/* 2018-01-16 02:00:00 */ )

Я хочу, чтобы массив стал:

[ Date/* 2018-01-16 01:00:00 */, Date/* 2018-01-16 01:15:00 */,  Date/* 2018-01-16 01:30:00 */, Date/* 2018-01-16 01:45:00 */, Date/* 2018-01-16 02:00:00 */]

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вот мой вариант, при условии, что период задается как start и end даты

let quarter: TimeInterval = 15 * 60
let dateInterval = DateInterval(start: start, end: end)

var date = start
var result = [Date]()
while dateInterval.contains(date) {
    result.append(date)
    date = date.addingTimeInterval(quarter)
}
0 голосов
/ 17 января 2019

Логика может быть примерно такой. Создать массив с начальной датой в качестве первого элемента. Затем добавьте даты с добавленными компонентами к последней дате, пока новая дата не станет больше даты окончания

func pad(to repletion: Int, _ component: Calendar.Component, from: Date? = nil, to: Date? = nil) {

    guard let start = from ?? self.earliest, let end = to ?? self.latest else {
        print("no date given and none available")
        return
    }

    var components = DateComponents()
    components.setValue(repletion, for: component)
    let calendar = Calendar.current

    var dates = [start] // results

    while start < end {
        if let newDate = calendar.date(byAdding: components, to: dates.last!), 
           newDate <= end {
            dates.append(newDate)
        } else { break }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...