DateFormatter是Foundation 框架提供的日期格式化类,用于把日期转成指定格式的字符串,或把字符串解析成日期。
它属于可重用、可配置的格式化器,内部有复杂的国际化、地区设置、日历规则等逻辑。
基本用法
1、创建实例
let formatter = DateFormatter()
2、设置日期格式
formatter.dateFormat = "y-MM-dd"
3、格式化日期
let date = Date() // 当前日期
let dateString = formatter.string(from: date)
print(dateString) // "2024-10-06 12:00"
或者解析日期字符串
let dateString = "2024-10-06"
if let date = formatter.date(from: dateString) {
print(date) // 解析字符串为 Date 对象
}
注意:如果格式和Date不匹配,则无法生成对应的对象,返回nil。
常用属性
1、dateFormat:指定日期字符串的格式,用于解析(字符串 → 日期)或格式化(日期 → 字符串)。
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
2、dateStyle / timeStyle:让系统自动决定日期和时间的格式(适合展示给用户)。
formatter.dateStyle = .medium
formatter.timeStyle = .short
注意:dateFormat和dateStyle/timeStyle互斥,不能同时使用。
3、locale:决定月份名称、星期名、AM/PM 格式的语言。
formatter.locale = Locale(identifier: "en_US_POSIX")
推荐使用en_US_POSIX,因为它是一种“标准化”语言环境,永远使用英文格式,避免用户设备语言导致解析失败(特别是 CSV/JSON 里的标准格式)。
4、timeZone:决定日期字符串如何解析为 Date(内部时间)。
formatter.timeZone = TimeZone(secondsFromGMT: 0) // UTC时间
如果不设置时区,就会使用系统当前时区,可能导致时间误差。
5、calendar:决定日期的计算方式(公历、伊斯兰历、佛历等)。
formatter.calendar = Calendar(identifier: .gregorian)
通常使用公历(gregorian),但如果处理的是特定地区数据,就可能要换。
6、isLenient:设置为 true 时,允许解析时对不规则格式宽容。
formatter.isLenient = true
例如:
formatter.dateFormat = "yyyy-MM-dd"
formatter.date(from: "2025-2-5") // 正常解析,虽然格式不对齐
7、doesRelativeDateFormatting:启用后,日期会显示为 “今天”、“明天”、“昨天”等。
formatter.doesRelativeDateFormatting = true
只适用于 dateStyle / timeStyle 模式,且仅在部分语言中生效。
常用方法
格式化器最核心的两个方法:
1、string(from: Date) -> String:日期转换为String类型。
let text = formatter.string(from: Date())
2、date(from: String) -> Date?:String类型转换为Date类型。
let date = formatter.date(from: "2025-01-01")
SwiftUI格式化
SwiftUI 本身没有新的日期格式化类型,Text、TextField、DatePicker等组件需要显示日期的某种格式,需要使用DateFormatter对日期进行格式化。
例如:
// 格式化日期
func formattedDate(_ date: Date) -> String {
let formatter = DateFormatter()
formatter.dateStyle = .medium // 设置日期样式
formatter.timeStyle = .none // 设置不显示时间
return formatter.string(from: date)
}
Text(formattedDate(currentDate)) // Dec 8, 2025
如果显示不同的日期格式或自定义格式,可以使用dateFormat:
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
注意事项
1、推荐使用全局复用的单例
每次刷新View都会创建一个DateFormatter,可能会造成性能问题。
建议使用单例、静态属性,以便全局复用:
extension DateFormatter {
static let ymd: DateFormatter = {
let f = DateFormatter()
f.dateFormat = "yyyy-MM-dd"
return f
}()
}
SwiftUI显示
Text(Date(), formatter: DateFormatter.ymd)
2、locale属性使用”en_US_POSIX”
locale属性需要使用”en_US_POSIX”,才能保证解析稳定,尤其是服务器返回固定格式时。
总结
DateFormatter可以实现日期和文本之间的格式化显示和转换。
SwiftUI还可以使用formatted()显示日期格式(iOS 15+),支持日期、数字等类型的格式化。
相关文章
1、Swift格式化formatted():https://fangjunyu.com/2025/12/03/swift%e6%a0%bc%e5%bc%8f%e5%8c%96formatted/
扩展知识
1、其他属性
1、amSymbol / pmSymbol:自定义上午/下午文字。
2、shortMonthSymbols / monthSymbols:自定义月份名称。
3、shortWeekdaySymbols / weekdaySymbols:自定义星期名称。
4、eraSymbols:纪元符号(比如公元前/公元)。
5、generatesCalendarDates:决定解析结果是否符合日历规则。
6、twoDigitStartDate / defaultDate:为解析不完整的日期提供默认值。
7、weekdaySymbols:返回星期字符串数组,例如[“Sunday”, “Monday”, “Tuesday”, …]。
8、shortWeekdaySymbols:返回星期字符串数组的简写,例如[“Sun”, “Mon”, …]。
9、veryShortWeekdaySymbols:返回星期字符串数组的最短简写,例如[“S”, “M”, “T”, “W”, …]。
10、monthSymbols:返回月份字符串数组,例如[“星期日”, “星期一”, …]。
11、shortMonthSymbols:返回月份字符串数组的简写,例如[“周日”, “周一”, …]。
12、veryShortStandaloneWeekdaySymbols:返回月份字符串数组的最短简写,例如[“日”,”一”,”二”,”三”,”四”,”五”,”六”]。
注:weekdaySymbols、shortMonthSymbols等属性需要配置对应的Locale使用。
2、其他方法
这些是 DateFormatter 继承自 Formatter 的:
1、string(for: Any?) -> String?:比 string(from:) 更通用,但不推荐。
2、editingString(for:):用于编辑时的特殊格式。
3、isPartialStringValid(…):输入逐字验证,几乎不用,太繁琐。
3、dateFormat属性
DateFormatter的.dateFormat属性用于指定日期和时间的显示格式。它接收一个格式字符串,用来定义日期和时间的输出样式。其中“y-MM-dd”是一种日期格式,表示年份、月份和日期。
formatter.dateFormat = "y-MM-dd"
常见的日期格式:
1、”yyyy-MM-dd”: 表示 2024-10-03(标准年-月-日格式)。
2、”dd/MM/yyyy”: 表示 03/10/2024(日/月/年格式)。
3、”MMM d, yyyy”: 表示 Oct 3, 2024(缩写月份、日期和年份)。
4、”EEEE, MMMM d, yyyy”: 表示 Thursday, October 3, 2024(完整的星期几、月份、日期和年份)。
日期格式解析:
1、Y表示年份(Year),例如2024
2、MM表示月份(Month),是两位数,零填充。例如01表示一月,12表示十二月。
3、dd表示日期,也是两位数,零填充。例如01表示一号,31表示三十一号。
4、HH表示小时,也是两位数,零填充。例如01表示1点,23表示23点。
5、mm表示分钟,也是两位数,零填充。例如01表示1分,59表示59分。
6、ss表示秒钟,也是两位数,零填充。例如13表示13秒。

4、dateStyle和timeStyle格式
dateStyle和timeStyle,用于定义日期和时间的样式。
它们提供了一些预设的样式选项,适用于大多数常见的日期/时间格式。
formatter.dateStyle = .medium
formatter.timeStyle = .short
dateStyle:控制日期部分的格式(如年、月、如)。
timeStyle:控制时间部分的格式(如时、分、秒)
日期和时间的预设值包括:
1、.short: 短格式,例如 10/6/24 或 2:34 PM
2、.medium: 中等长度,例如 Oct 6, 2024 或 2:34:00 PM
3、.long: 长格式,例如 October 6, 2024
4、.full: 完整格式,例如 Sunday, October 6, 2024
5、.none: 表示不显示日期或时间。
注意:只适合展示用,不适合解析固定格式的数据。
