我正在尝试构建一个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
。然后我们将时间范围映射到Date
的Array
,从startDate
到endDate
,然后我们将映射到小时值的Array
。然后我们将映射到String
的Array
,格式为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"]