如何通过if let识别接口返回字符串中的年份或ISO8601日期?
嘿,这个场景我之前做项目时碰到过,刚好有两种实用的方法可以解决,看你需求选就行👇
方法一:用正则表达式直接匹配格式
这种方式不用把字符串转成Date,纯粹从字符结构上判断,速度更快,适合只需要区分类型的场景。
思路很简单:
- 年份字符串就是纯4位数字,用正则
^\d{4}$匹配 - 你提到的ISO8601格式(比如
1995-01-01T00:00:00Z)有固定结构,用正则^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$匹配
直接上代码:
let inputString = "1995-01-01T00:00:00Z" // 换成你要判断的字符串 do { // 匹配4位年份的正则 let yearRegex = try NSRegularExpression(pattern: "^\\d{4}$") // 匹配目标ISO8601格式的正则 let isoRegex = try NSRegularExpression(pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$") let stringRange = NSRange(inputString.startIndex..., in: inputString) if yearRegex.firstMatch(in: inputString, range: stringRange) != nil { print("这是年份字符串") // 这里可以做年份相关的处理 } else if isoRegex.firstMatch(in: inputString, range: stringRange) != nil { print("这是ISO8601格式的日期字符串") // 这里可以做ISO日期相关的处理 } else { print("字符串格式既不是年份也不是目标ISO8601格式") } } catch { print("正则表达式创建失败:\(error)") }
方法二:用DateFormatter尝试解析(更严谨)
如果你不仅要判断类型,还要后续把字符串转成Date,那直接用Formatter尝试解析会更靠谱,因为它能验证字符串是否是有效的日期(比如正则会匹配"9999",但如果业务里年份有范围限制,Formatter结合配置可以过滤)。
代码示例:
let inputString = "2023" // 换成你要判断的字符串 // 配置年份解析器 let yearFormatter = DateFormatter() yearFormatter.dateFormat = "yyyy" yearFormatter.locale = Locale(identifier: "en_US_POSIX") // 固定locale避免地区差异 yearFormatter.timeZone = TimeZone(secondsFromGMT: 0) // 配置ISO8601解析器(系统自带的,比自定义DateFormat更可靠) let isoFormatter = ISO8601DateFormatter() if let _ = yearFormatter.date(from: inputString) { print("这是年份字符串") // 可以在这里转成Date或者直接提取年份数字 } else if let _ = isoFormatter.date(from: inputString) { print("这是ISO8601格式的日期字符串") // 可以在这里转成Date做后续处理 } else { print("格式不匹配,无法解析") }
小提示
- 如果你的ISO8601字符串有其他变体(比如带毫秒、不带Z时区),可以调整
ISO8601DateFormatter的options参数,比如[.withFullDate, .withFullTime, .withColonSeparatorInTime] - 正则方法适合快速判断格式,Formatter方法适合需要确保日期有效性的场景,根据你的业务需求选就行~
内容的提问来源于stack exchange,提问作者Reimond Hill
相关产品推荐
相关产品推荐

