Рассчитать среднее время между массивом дат - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть массив объектов, которые приложение получает от WebService, у каждого объекта есть createdTime, и объекты создаются случайным образом с 6 утра до полуночи.

Я хочу знать, чтосреднее время между созданием каждого объекта.Каков наилучший и наиболее эффективный способ его реализации?

Даты имеют следующий формат: "CreatedTime": "2019-02-18T22:06:30.523 "

1 Ответ

0 голосов
/ 19 февраля 2019

Средний интервал даты - это время, прошедшее между первой и последней датой и деленное на n-1, количество интервалов.Это будет наиболее эффективно.

Это работает, потому что среднее значение равно сумме интервалов, деленной на количество интервалов.Но сумма всех интервалов равна разнице между первой и последней датой.

Предполагая, что строки вашей даты уже в порядке, просто возьмите первую и последнюю, вычислите разницу и разделите.

let dateStrings = ["2019-02-18T18:06:30.523", "2019-02-18T19:06:30.523", "2019-02-18T21:06:30.523"]

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)           // I’m going to assume it’s GMT; what is it really?

guard dateStrings.count > 1,
    let lastDateString = dateStrings.last,
    let lastDate = dateFormatter.date(from: lastDateString),
    let firstDateString = dateStrings.first,
    let firstDate = dateFormatter.date(from: firstDateString) else { return }

let average = lastDate.timeIntervalSince(firstDate) / Double(dateStrings.count - 1)

Это в секундах.Если вам нужен хороший формат строки и вам не нужны миллисекунды, DateComponentsFormatter удобен для локализованных строк:

let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [.hour, .minute, .second]
dateComponentsFormatter.unitsStyle = .full
let string = dateComponentsFormatter.string(from: average)

, который выдает:

"1час, 30 минут "


Или вы можете, менее эффективно, построить массив dates:

let dateStrings = ["2019-02-18T18:06:30.523", "2019-02-18T19:06:30.523", "2019-02-18T21:06:30.523"]

guard dateStrings.count > 1 else { return }

let dates = dateStrings.map { dateFormatter.date(from: $0)! }

Затем вы можете построить массив интервалов между этимидаты:

var intervals: [TimeInterval] = []
for index in 1 ..< dates.count {
    intervals.append(dates[index].timeIntervalSince(dates[index-1]))
}

А затем усредните их:

let average = intervals.reduce(0.0, +) / Double(intervals.count)

И формат по вкусу:

let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [.hour, .minute, .second]
dateComponentsFormatter.unitsStyle = .full
let string = dateComponentsFormatter.string(from: average)
...