我想解析一个yyyyMMdd格式的日期.

let strategy = Date.ParseStrategy(
    format: "\(year: .defaultDigits)\(month: .twoDigits)\(day: .twoDigits)",
    locale: Locale(identifier: "fr_FR"),
    timeZone: TimeZone(abbreviation: "UTC")!)

let date = try? Date("20220412", strategy: strategy) // nil :(

strategy有什么问题?

推荐答案

问题是,对于这种日期格式,.defaultDigits不适用于.year,原因很可能是因为该格式不包含分隔符,因此解析器无法自动推断年份部分使用的位数.

如果我们try 使用分离器,它会很好地工作.例如yyyy-MM-dd

let strategy = Date.ParseStrategy(
    format: "\(year: .defaultDigits)-\(month: .twoDigits)-\(day: .twoDigits)",
    locale: Locale(identifier: "fr_FR"),
    timeZone: TimeZone(abbreviation: "UTC")!)

if let date = try? Date("2022-04-12", strategy: strategy) { print(date) }

输出

2022-04-12 00:00:00 +0000

不带分隔符的格式的解决方案是使用.padded(另一个选项是.extended(minimumLength:))明确地告诉策略年份部分包含多少位数

let strategy = Date.ParseStrategy(
    format: "\(year: .padded(4))\(month: .twoDigits)\(day: .twoDigits)",
    locale: Locale(identifier: "fr_FR"),
    timeZone: TimeZone(abbreviation: "UTC")!)

if let date = try? Date("20220412", strategy: strategy) { print(date) }

again 输出

2022-04-12 00:00:00 +0000

Swift相关问答推荐

依赖于@Environment的init@StateObject

使用MKLocalSearch获取坐标

SWIFT异步/等待,多个监听程序

如何在枚举有关联数据时使用combined if with case

如何避免切换视图递归onChange调用SwiftUI

可以';t在标记为@Observable的类上使用属性包装

Swift图表';chartXVisibleDomain挂起或崩溃

为什么我不能在这个 Swift 间接枚举中返回 self ?

将变量设置为 @Published 会 destruct 代码而不会出现任何错误

(Swift)混淆了函数内 for-in 循环的返回值和循环后(函数内)的返回值)

Swift 并发:@MainActor 对象上的通知回调

Swift并发:为什么不在其他后台线程上执行任务

Swift 全局函数列表

持久化字符串列表属性 RealmSwift

Swift - 如何更新多目录中的对象

Swift 3:小数到 Int

Alamofire:如何全局处理错误

无法将 NSAttributedString.DocumentAttributeKey 类型的值转换为 .DocumentReadingOptionKey

Swift 正则表达式:字符串是否与模式匹配?

'self' 在所有存储的属性被初始化之前使用