如何使用 Date.ParseStrategy 在 Swift 5.6 中将字符串解析为日期?
How to parse a String to a Date in Swift 5.6 using Date.ParseStrategy?
我想解析 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
,原因很可能是因为该格式不包含分隔符,因此解析器无法自动推导出用于年份部分的位数。
如果我们尝试使用分隔符,它会正常工作。例如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) }
再次打印
2022-04-12 00:00:00 +0000
我想解析 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
,原因很可能是因为该格式不包含分隔符,因此解析器无法自动推导出用于年份部分的位数。
如果我们尝试使用分隔符,它会正常工作。例如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) }
再次打印
2022-04-12 00:00:00 +0000