Swift中如何为字符串添加单引号和连字符且无转义?
解决日期字符串格式转换与解析问题
核心问题分析
你遇到的问题本质是两个点:
- 字符串转换时误以为单引号需要转义(控制台显示的反斜杠只是调试时的视觉转义,实际字符串并无反斜杠)
- DateFormatter解析时未正确配置格式字符串,导致无法识别带单引号的
'T'部分
正确实现方式
方法一:通过DateFormatter直接转格式(推荐)
这种方法无需手动拆分字符串,利用日期对象中转,避免格式错误:
let originalDateStr = "20230914T07:37:43.000Z" // 1. 解析原字符串为Date对象 let inputFormatter = DateFormatter() inputFormatter.dateFormat = "yyyyMMdd'T'HH:mm:ss.SSSZ" inputFormatter.locale = Locale(identifier: "en_US_POSIX") // 必须设置,避免区域格式干扰 inputFormatter.timeZone = TimeZone(secondsFromGMT: 0) // UTC时区 guard let date = inputFormatter.date(from: originalDateStr) else { fatalError("原日期字符串格式无效") } // 2. 将Date格式化为目标字符串 let outputFormatter = DateFormatter() // 注意:格式字符串中用两个单引号表示实际的一个单引号 outputFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ss.SSSZ" outputFormatter.locale = Locale(identifier: "en_US_POSIX") outputFormatter.timeZone = TimeZone(secondsFromGMT: 0) let targetDateStr = outputFormatter.string(from: date) // targetDateStr 结果为:"2023-09-14'T'07:37:43.000Z"
方法二:手动字符串拼接(适合简单场景)
如果不想用DateFormatter,也可以直接拆分拼接字符串:
let originalDateStr = "20230914T07:37:43.000Z" // 拆分日期部分和时间部分 guard originalDateStr.count >= 9 else { fatalError("原字符串格式错误") } let datePrefix = originalDateStr.prefix(8) // "20230914" let timeSuffix = originalDateStr.suffix(from: originalDateStr.index(startIndex, offsetBy: 9)) // "07:37:43.000Z" // 格式化日期部分:添加连字符 let formattedDate = "\(datePrefix.prefix(4))-\(datePrefix.dropFirst(4).prefix(2))-\(datePrefix.dropFirst(6))" // 拼接目标字符串 let targetDateStr = "\(formattedDate)'T'\(timeSuffix)"
解析目标字符串的正确姿势
如果需要将转换后的字符串再转回Date对象,同样要注意格式字符串的写法:
let parseFormatter = DateFormatter() parseFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ss.SSSZ" parseFormatter.locale = Locale(identifier: "en_US_POSIX") parseFormatter.timeZone = TimeZone(secondsFromGMT: 0) if let parsedDate = parseFormatter.date(from: targetDateStr) { print("解析成功:\(parsedDate)") } else { print("解析失败") }
关于单引号转义的误区
你看到的控制台输出中的反斜杠(比如"2023-09-14\'T\'...")只是Xcode调试时的显示逻辑,实际字符串中并没有反斜杠。可以通过打印字符串长度、遍历字符等方式验证,实际字符串内容是正确的2023-09-14'T'07:37:43.000Z。
内容的提问来源于stack exchange,提问作者Sham Dhiman
相关产品推荐
相关产品推荐

