import Foundation /// 后端 ISO 8601 时间字符串 → 友好展示。后端 datetime 可能带/不带时区与微秒,逐档尝试解析。 enum AppDate { static func friendly(_ iso: String) -> String { guard let date = parse(iso) else { return String(iso.prefix(10)) } let f = DateFormatter() f.locale = Locale(identifier: "zh_CN") f.dateFormat = "M月d日" return f.string(from: date) } private static func parse(_ iso: String) -> Date? { let isoFmt = ISO8601DateFormatter() isoFmt.formatOptions = [.withInternetDateTime, .withFractionalSeconds] if let d = isoFmt.date(from: iso) { return d } isoFmt.formatOptions = [.withInternetDateTime] if let d = isoFmt.date(from: iso) { return d } let df = DateFormatter() df.locale = Locale(identifier: "en_US_POSIX") df.timeZone = TimeZone(identifier: "Asia/Shanghai") for fmt in ["yyyy-MM-dd'T'HH:mm:ss.SSSSSS", "yyyy-MM-dd'T'HH:mm:ss.SSS", "yyyy-MM-dd'T'HH:mm:ss"] { df.dateFormat = fmt if let d = df.date(from: iso) { return d } } return nil } }