Swift 5.9.2中.dateTime.hour(.defaultDigits)去前导零失效问题
问题原因
.defaultDigits 参数的作用是指定使用本地化的默认数字表示体系(比如阿拉伯数字、印度数字等),并非控制小时是否移除前导零。对于德语(de)locale,24小时制的默认小时格式就是带前导零的,因此即使使用 .defaultDigits,也会遵循locale的预设规则输出 09 Uhr。
解决方案
方案1:使用自定义格式模式
通过 .customPattern 指定小时的格式规则,24小时制下用 k 表示不带前导零的小时(1-24),替换原有的 .defaultDigits:
var dateComponents = DateComponents() dateComponents.year = 2024 dateComponents.month = 8 dateComponents.day = 26 dateComponents.hour = 9 dateComponents.minute = 45 let date = Calendar.current.date(from: dateComponents)! // 24小时制不带前导零 print(date.formatted(.dateTime.hour(.customPattern("k")).locale(Locale(identifier: "de")))) // 输出"9 Uhr"
如果是12小时制场景,可用 h 表示不带前导零的小时(1-12)。
方案2:使用传统 DateFormatter
若需要更灵活的格式控制,传统 DateFormatter 可以直接指定格式或通过本地化模板配置:
let formatter = DateFormatter() formatter.locale = Locale(identifier: "de") // 使用本地化模板,自动适配locale的时间后缀(如德语的"Uhr") formatter.setLocalizedDateFormatFromTemplate("k") print(formatter.string(from: date)) // 输出"9 Uhr" // 或者直接指定格式字符串(硬编码后缀需注意locale适配) // formatter.dateFormat = "k 'Uhr'" // print(formatter.string(from: date))
内容的提问来源于stack exchange,提问作者Garik Hovsepyan
相关产品推荐
相关产品推荐

