You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:16:00