Swift中仅时间字符串转日期及格式化为HH:mm的问题咨询
问题分析与优化方案
嘿,我来帮你拆解下这个问题~ 首先你遇到的核心问题是convertStringToDate方法返回nil,虽然最终结果看似正确,但代码确实存在不规范的地方,而且有潜在崩溃风险,咱们一步步来修正:
1. 为什么convertStringToDate会返回nil?
你的输入时间字符串是"17:10:51.2800000",带有7位毫秒数,但你在方法里用了:
formatter.setLocalizedDateFormatFromTemplate("HH:mm:ss.SSS")
这里的SSS只匹配3位毫秒,和输入的7位不匹配,所以date(from:)直接返回了nil。另外,setLocalizedDateFormatFromTemplate是用来生成本地化的日期格式,并不适合解析固定格式的字符串,应该直接指定dateFormat。
2. 现有代码的其他隐患
- 你在
convertStringToDate里强行解包dateInString!,虽然目前没崩溃,但如果后续输入的字符串格式不对,程序会直接崩溃,非常危险。 convertDateToString的逻辑绕了弯路:先把Date转成带毫秒的字符串,再转回Date,最后才转成HH:mm,完全没必要做这些多余的转换。
3. 优化后的代码
咱们把两个方法都简化并修正:
修正日期字符串转Date的方法
func convertStringToDate(getDate: String) -> Date? { let formatter = DateFormatter() // 匹配输入的7位毫秒格式 formatter.dateFormat = "HH:mm:ss.SSSSSSS" // 明确时区为UTC,避免无日期时的时区歧义 formatter.timeZone = TimeZone(identifier: "UTC") // 返回可选值,让调用者处理nil情况 return formatter.date(from: getDate) }
简化Date转HH:mm字符串的方法
func convertDateToString(getDate: Date) -> String { let formatter = DateFormatter() formatter.dateFormat = "HH:mm" formatter.timeZone = TimeZone.current // 直接转换,无需多余步骤 return formatter.string(from: getDate) }
调用时的处理(避免强行解包)
if let time = time, let date = convertStringToDate(getDate: time) { let dateString = convertDateToString(getDate: date) print(dateString) // 输出 17:10(根据当前时区可能有变化,如果你要保持UTC时间的话,把convertDateToString里的时区改成UTC即可) } else { // 处理时间字符串格式错误的情况 print("时间格式不正确") }
4. 额外说明
如果你希望最终的HH:mm是UTC时间的话,只需要把convertDateToString里的timeZone改成TimeZone(identifier: "UTC")就行。
现在代码逻辑清晰,没有多余转换,也处理了可选值的情况,不会有崩溃风险啦~
内容的提问来源于stack exchange,提问作者user3120670
相关产品推荐
相关产品推荐

