ios - 计算日期数组之间的平均时间

标签 ios swift time nsdate nstimeinterval

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

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

日期采用以下格式:"CreatedTime": "2019-02-18T22:06:30.523"

最佳答案

平均日期间隔是第一个日期和最后一个日期之间耗时除以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 hour, 30 minutes"


或者您可以构建 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)

关于ios - 计算日期数组之间的平均时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54754928/

相关文章:

ios - MonoTouch 创建带圆角的 UIImage

json - 带有嵌套 json 数组的 Swift Codable/Decodable

swift - 在 View 中设置高度并忽略安全顶部边缘

iphone - uitableViewcell 中的 UIImage 会减慢滚动表的速度

ios - 连续语音识别。使用 SFSpeechRecognizer (ios10-beta)

java - 查找字典中最长单词的代码的时间复杂度

javascript - 每隔一分钟运行一次 JS 函数

c# - 在文本框中显示时间并使用上下箭头进行修改

ios - 这种类型的日期格式

ios - UITableView - 在 sectionHeader 中调整 FontSizeToFitWidth