从两个日期中获取小时数组



我正在尝试构建一个swiftui应用程序,我试图从日期中获得时间,所以我的日期是:09.12.2022 09:00-09.13.2022 09:00

我已经让它告诉我日期之间有24小时,但我想显示日期,如09:00,10:00,11:00,12:00,13:00等,直到它达到关闭日期

这是我到目前为止的代码。它返回了在屏幕上创建foreachloop的时间。

func getHours(:字符串)→Int {

let fullNameArr : [String] = times.components(separatedBy: "-")

print(fullNameArr[0])
print(fullNameArr[1])

// Create Date Formatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM.dd.yyyy HH:mm"
let date1 = dateFormatter.date(from: fullNameArr[0])!
let date2 = dateFormatter.date(from: fullNameArr[1])!

let cal = Calendar.current
let components = cal.dateComponents([.hour], from: date1, to: date2)
let diff = components.hour!
for i in stride(from: 0, to: diff, by: 1) {
print(i)
}
return diff

}

您需要的是使用日历方法nextDate(after:)并匹配组件minute等于0:

func getHours(times: String)-> [String] {

let components = times.components(separatedBy: "-")
guard components.count == 2,
var start = DateFormatter.custom.date(from: components[0]),
let end = DateFormatter.custom.date(from: components[1]),
start < end else {
return []
}
var dates: [Date] = []
if start.minute == 0 {
dates.append(start)
}
while start < end {
guard let date = Calendar(identifier: .iso8601).nextDate(after: start, matching: DateComponents(minute: 0), matchingPolicy: .strict) else {
continue
}
if date < end {  // If you want to include the end date as well just remove this condition
dates.append(date)
}
start = date
}
return dates.map(DateFormatter.time.string)
}

你将需要那些日期格式化程序

extension DateFormatter {
static let custom: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.calendar = .init(identifier: .iso8601)
dateFormatter.locale = .init(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "MM.dd.yyyy HH:mm"
return dateFormatter
}()
static let time: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.calendar = .init(identifier: .iso8601)
dateFormatter.locale = .init(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "HH:mm"
return dateFormatter
}()
}

和这个日期扩展:

extension Date {
var minute: Int {
Calendar(identifier: .iso8601).component(.minute, from: self)
}
}

用法:

let times = "09.12.2022 09:00-09.13.2022 09:00"
print(getHours(times: times))

打印

["09:00","10:00","11:00","12:00","13:00","14:00","15:00","16:00","17:00","18:00","19:00","20:00","21:00","22:00","23:00","00:00","01:00","02:00","03:00","04:00","05:00","06:00","07:00","08:00"]

您已经知道如何获得小时差:

let endDate = Date()
let startDate = endDate - 24.0 * 60.0 * 60.0
let diffHours = Calendar.current
.dateComponents([.hour], from: startDate, to: endDate)

现在我们要做一个从0到diffHours小时的Range。然后我们将时间范围映射到DateArray,从startDateendDate,然后我们将映射到小时值的Array。然后我们将映射到StringArray,格式为01:00

let hours = (0...(diffHours.hour ?? 0))
.compactMap { Calendar.current.date(byAdding: .hour, value: $0, to: startDate) }
.map { Calendar.current.component(.hour, from: $0) }
.map { String(format: "%02d:00", $0) }

%d告诉格式化程序你想要一个整数

%02d告诉格式化程序你想要两个前导零的数字

现在让我们看看我们有什么:

print("ZZZ range:", (startDate..<endDate).formatted())
print("ZZZ hours:", hours)

打印:

ZZZ range: 6/17/22, 1:50 PM – 6/18/22, 1:50 PM
ZZZ hours: ["13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00", "00:00", "01:00", "02:00", "03:00", "04:00", "05:00", "06:00", "07:00", "08:00", "09:00", "10:00", "11:00", "12:00", "13:00"]

最新更新