我在将字符串日期解析为日期格式时遇到一些麻烦。
我从一个API接收具有这种格式的日期字符串2020-08-27 12:39:32
(日期以24小时格式),并且我有String的扩展名将其转换为Date。所以我做这样的转换:
apiTime.toDate(format: "yyyy-MM-dd HH:mm:ss")
如果电话配置为24小时,则一切正常。当应用程序以AM / PM日期格式运行时出现问题,因为日期返回nil。
这是我将String转换为Date的扩展。
extension String {
func toDate(format: String) -> Date? {
let dateFormatter = DateFormatter()
dateFormatter.amSymbol = "AM"
dateFormatter.pmSymbol = "PM"
dateFormatter.dateFormat = format
return dateFormatter.date(from: self) //here return nil with AM/PM format
}
}
正如@LeoDabus所建议的那样,最好不要DateFormatter
每次都创建(这非常消耗资源)。您可以提取它,例如。作为静态属性。
这是一个简单的演示:
class Test {
static let dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
return dateFormatter
}()
func parseDateExample() {
let apiTime = "2020-08-27 12:39:32"
if let date = apiTime.toDate(formatter: Self.dateFormatter, format: "yyyy-MM-dd HH:mm:ss") {
print(date)
} else {
print("error")
}
}
}
您可以在String扩展名中重用格式化程序,而不必每次调用都创建一个新的格式化程序toDate
:
extension String {
func toDate(formatter: DateFormatter, format: String) -> Date? {
formatter.dateFormat = format
return formatter.date(from: self)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句