计算一组日期之间的平均时间

问题描述 投票:0回答:1

我有一个对象数组,应用程序从WebService获取,每个对象都有一个createdTime,对象是从早上6点到午夜随机创建的。

我想知道每个对象创建之间的平均时间是多少。实施它的最佳和最有效的方法是什么?

日期的格式为:"CreatedTime": "2019-02-18T22:06:30.523

ios swift time nsdate nstimeinterval
1个回答
1
投票

平均日期间隔是第一个和最后一个日期之间经过的时间,除以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)
© www.soinside.com 2019 - 2024. All rights reserved.