Date提供一个formatted方法,用于格式化日期和时间的类型,接收遵循FormatStyle的对象,属于 Foundation 框架。
从 Swift 5.5 和 iOS 15 开始,Apple 引入了这个 API,用以提供更灵活且可读的日期格式化方式。
基本用法
1、格式化日期
let now = Date()
let text = now.formatted(Date.FormatStyle().year().month().day()) // Dec, 8, 2025
2、格式化日期(链式)
now.formatted(
.dateTime
.year()
.month()
.day()
.locale(Locale(identifier: "zh_CN"))
)
3、格式化(枚举)
now.formatted(date: .abbreviated, time: .shortened)
4、格式化(相对时间)
date.formatted(.relative(presentation: .numeric)) // 2 minutes ago
5、格式化(ISO标准)
date.formatted(.iso8601) // 2024-10-06T22:04:16Z
格式化选项
1、基本格式化组件
.year(_:):年份显示方式,例如 .defaultDigits(四位数年份)或 .twoDigits(两位数年份)。
.month(_:):月份显示方式,例如 .twoDigits(数字形式:01月)、.abbreviated(缩写:1月)、.wide(完整拼写:一月)、.defaultDigits(缩写,1月)、. narrow(缩写,1)。
.day(_:):日期格式,例如 .twoDigits(01-31)。
.hour(_:):小时格式,例如 .defaultDigits 或 .twoDigits,可以选择是否包括 AM/PM。
.minute(_:) 和 .second(_:):分钟和秒的显示方式。
.weekday(_:):星期格式,例如.wide、.abbreviated或.narrow。
2、区域化和时区
.locale(_:):设置区域化语言,例如 Locale(identifier: “en_US”) 或 Locale(identifier: “zh_CN”)。
.locale(Locale(identifier: "zh_CN"))
.timeZone(_:):指定时区,例如 TimeZone.current。
.timeZone(.gmt)
.calendar(_:):设置日历。
.calendar(.init(identifier: .iso8601))
3、date枚举
.omitted:忽略日期。
.numberic:数字化日期。例如,2024/10/6。
.abbreviated:月份缩写,年份不缩写。例如,Oct 6, 2024
.long:月份完整,年份完整。例如,October 6, 2024
.complete:星期+月份全称+年份:Sunday, October 6, 2024
注意:根据locale,显示本地化的日期字符串。
4、time枚举
.omitted:忽略时间。
.shortened:缩写时间。例如,22:04
.standard:标准写法。例如,22:04:30
.complete:完整写法,包括时区。例如,22:04:30 GMT+8
总结
旧DateFormatter存在可变状态、多配置、线程不安全、依赖字符串pattern。
FormatStyle则倾向值类型,明确的语义API、更安全,写法也更现代。
通过简单的链式调用,可以灵活地适配不同的日期/时间展示需求。
相关文章
1、SwiftUI DateFormatter日期格式化:https://fangjunyu.com/2024/10/06/swift-ui%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3dateformatter/
2、Swift格式化formatted():https://fangjunyu.com/2025/12/03/swift%e6%a0%bc%e5%bc%8f%e5%8c%96formatted/
