计算日期数组之间的平均时间
Calculate average time between an array of dates
我有一个应用程序从 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: [=12=])! }
然后您可以在这些日期之间构建一个间隔数组:
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)
我有一个应用程序从 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: [=12=])! }
然后您可以在这些日期之间构建一个间隔数组:
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)