SwiftUI DateFormatter日期格式化
SwiftUI DateFormatter日期格式化

SwiftUI DateFormatter日期格式化

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: 表示不显示日期或时间。

注意:只适合展示用,不适合解析固定格式的数据。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注