可以通过根据持续时间修改allowedUnits 和zeroFormattingBehavior 来创建适当的位置时间字符串。请注意,如果希望只有一个,这将在几分钟内填充两个前导零,以便以后以安全的方式处理这种情况。
let formatter = DateComponentsFormatter()
if duration < 60 {
formatter.allowedUnits = [.minute, .second]
formatter.zeroFormattingBehavior = .pad //pad seconds and minutes ie 00:05
} else if duration >= 60*60 {
formatter.allowedUnits = [.hour, .minute, .second]
}
var formattedDuration = formatter.string(from: duration) ?? "0"
if formattedDuration.hasPrefix("00") {
formattedDuration = String(formattedDuration.dropFirst()) //remove leading 0 ie 0:05
}
这是durations 和formattedDurations 的列表:
0 ▶️ 0:00
5 ▶️ 0:05
30 ▶️ 0:30
60 ▶️ 1:00
65 ▶️ 1:05
3600 ▶️ 1:00:00
3665 ▶️ 1:00:05
3660 ▶️ 1:01:00
替代解决方案
通过使用.dropTrailing zeroFormattingBehavior,您可以在不检查两个前导零的情况下获得相同的结果,这很有趣。我会提醒我不完全理解为什么会这样,也不知道它可能对本地化产生什么影响。请注意,如果持续时间为0,则结果为"0",因此我们可以在这种情况下使用.pad 来获得"00:00" 的结果。这样您最终会遇到上述相同的情况,但也许您会觉得这是一个可能不需要处理的边缘情况。
let formatter = DateComponentsFormatter()
if duration >= 60 {
formatter.allowedUnits = [.hour, .minute, .second]
formatter.zeroFormattingBehavior = .default
} else if duration == 0 {
formatter.allowedUnits = [.minute, .second]
formatter.zeroFormattingBehavior = .pad
//is 00:00 but should be 0:00
} else {
formatter.allowedUnits = [.minute, .second]
formatter.zeroFormattingBehavior = .dropTrailing //magic here
}
let formattedDuration = formatter.string(from: duration) ?? "0"