UI 午夜后的滑块时间?

UI Slider Time of Day Beyond Midnight?

所以这是一个独特的情况。我有一个双滑块,我使用 swift 制作了一个时间范围选择器,就像 Kayak 那样。不幸的是,我的时间范围必须在 00:00 到第二天早上 04:00 之间。

我的滑块控件使用 86340 秒的比例很容易将它从 00:00 提高到 23:59。我只是将它插入这个小函数,然后在 ends/knobs:

上弹出正确的范围
func getTimeStringFromSeconds(seconds: Double) -> String {
    let dcFormatter = NSDateComponentsFormatter()
    dcFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehavior.Pad
    dcFormatter.allowedUnits = [NSCalendarUnit.Hour, NSCalendarUnit.Minute]
    dcFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Positional
    return dcFormatter.stringFromTimeInterval(seconds)!
}

正如您在上面的屏幕截图中看到的,尽管我将 100740 秒作为刻度。我怎样才能让它超过 23:59,然后重置为 00:00 并进入第二天?我可以让它转到 28:00,如上所示,技术上应该是凌晨 4 点,但我希望它重新开始并显示 04:00,而不是 28:00。什么是好的解决方案?

请注意,到目前为止,我唯一的解决方案是通过在秒数超过 86340 后将秒数重置为 0.00 来让标签显示 0:00。比例仍然是 100740,但有一些像下面这样的数学使标签在不弄乱旋钮(upperValue)的值的情况下另有说明:

if upperKnobLayer.highlighted {
            upperValue += valueDelta
            upperValue = max(min(maximumValue, upperValue), lowerValue)
            var upperDouble = Double(round(upperValue))
            if upperDouble > 86340.00 {
                let newValue = upperDouble - 86340
                upperDouble = 0.00 + newValue
            }
            upperTime = getTimeStringFromSeconds(upperDouble)
}

这将有助于 post 选择器的实现,但通常您希望滑块值类型为 NSTimeIntervals。然后您可以获得一个参考日期,即今天的午夜 00:00。您可以使用 NSDate(timeIntervalSince:referenceDate) 然后获取表示自该参考日期以来的任何日期的 NSDate,可以相应地格式化并显示到屏幕上。这种方式的额外好处是,如果您的 timeInterval 使其溢出到第二天,日期的实际日期将是正确的

如何标准化为一天的秒数。

return dcFormatter.stringFromTimeInterval(seconds % 86340)!