创建时间间隔为 15 分钟的数组 (Swift)

Create an array of times with 15 minute interval (Swift)

我是编程新手,很难想出一种有效的方法来创建时间数组,而无需在 swift 中键入整个数组。

我想动态创建以下形式的数组:

["5:00","5:30", (...), "22:00"]

这是我目前的情况:

var timeSlots = [Double]()
var firstTime: Double = 5
var lastTime: Double = 22 // 10pm
var slotIncrement = 0.5
var numberOfSlots = Int((lastTime - firstTime) / slotIncrement)

var i: Double = 0
while timeSlots.count <= numberOfSlots {
    timeSlots.append(firstTime + i*slotIncrement)
    i += 1
}

print(timeSlots) // [5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0, 16.5, 17.0, 17.5, 18.0, 18.5, 19.0, 19.5, 20.0, 20.5, 21.0, 21.5, 22.0]

时间间隔部分很重要,因为我希望能够创建一个包含 15 分钟时间段、10 分钟时间段等的数组。

您只需将时间段元素乘以 60 即可将小时数转换为分钟数,然后使用 DateComponentsFormatter 使用 .positional unitsStyle 将 TimeInterval(秒)转换为String:

let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.unitsStyle = .positional

let times = timeSlots.flatMap{dateComponentsFormatter.string(from: [=10=] * 60)}
print(times)  // ["5:00", "5:30", "6:00", "6:30", "7:00", "7:30", "8:00", "8:30", "9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00", "14:30", "15:00", "15:30", "16:00", "16:30", "17:00", "17:30", "18:00", "18:30", "19:00", "19:30", "20:00", "20:30", "21:00", "21:30", "22:00"]

请注意,结果实际上意味着分钟和秒,但字符串表示正是您想要的。


另一种选择是使用 String(format:) 初始值设定项并创建自定义格式来转换您的小时数,如下所示:

extension Double {
    var hours2Time: String {
        return String(format: "%02d:%02d", Int(self), Int((self * 60).truncatingRemainder(dividingBy: 60)))
        // or formatting the double with leading zero and no fraction
        // return String(format: "%02.0f:%02.0f", rounded(.down), (self * 60).truncatingRemainder(dividingBy: 60))
    }
}

let times2 = timeSlots.map{ [=12=].hours2Time }
print(times2)  // // ["05:00", "05:30", "06:00", "06:30", "07:00", "07:30", "08:00", "08:30", "09:00", "09:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00", "14:30", "15:00", "15:30", "16:00", "16:30", "17:00", "17:30", "18:00", "18:30", "19:00", "19:30", "20:00", "20:30", "21:00", "21:30", "22:00"]
var timeArray: [String] = []
let firstTime: Double = 5
let lastTime: Double = 22 // 10pm
var currentTime: Double = 5
var incrementMinutes: Double = 15 // increment by 15 minutes

while currentTime <= lastTime {
    currentTime += (incrementMinutes/60)
    let hours = Int(floor(currentTime))
    let minutes = Int(currentTime.truncatingRemainder(dividingBy: 1)*60)
    if minutes == 0 {
        timeArray.append("\(hours):00")
    } else {
        timeArray.append("\(hours):\(minutes)")
    }
}

我遇到了类似的需求。这是我的解决方案,但它只适用于分钟间隔:

1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, and 60.

我没有开始或停止时间要求,但可以通过

进行调整

for h in 0..<24 { 中更改 0 - 24

var timeArray: [String] = []
    
let interval = 15
    
for h in 0..<24 {
    for m in 0..<(60/interval) {
        if m * interval == 0 {
            timeArray.append("\(String(format: "%02d", h))00")
        } else {
            timeArray.append("\(String(format: "%02d", h))\(String(format: "%02d", m * interval))")
        }
    }
}
    
print(timeArray)

输出:

["0000", "0015", "0030", "0045", "0100", "0115", "0130", "0145", "0200", "0215", "0230", "0245", "0300", "0315", "0330", "0345", "0400", "0415", "0430", "0445", "0500", "0515", "0530", "0545", "0600", "0615", "0630", "0645", "0700", "0715", "0730", "0745", "0800", "0815", "0830", "0845", "0900", "0915", "0930", "0945", "1000", "1015", "1030", "1045", "1100", "1115", "1130", "1145", "1200", "1215", "1230", "1245", "1300", "1315", "1330", "1345", "1400", "1415", "1430", "1445", "1500", "1515", "1530", "1545", "1600", "1615", "1630", "1645", "1700", "1715", "1730", "1745", "1800", "1815", "1830", "1845", "1900", "1915", "1930", "1945", "2000", "2015", "2030", "2045", "2100", "2115", "2130", "2145", "2200", "2215", "2230", "2245", "2300", "2315", "2330", "2345"]