如何使用这种格式将此字符串转换为日期?

How to convert this string in a date with this format?

我和一个 API 一起工作,当我要求约会时,这个 API 让我的 String 像这样:

20190717-0300

我想在 UILabel 中显示该日期,格式如下:"dd '\(preposition)' MMMM"

我的尝试是进行字符串扩展:

extension String {
 var toDate: String? {
        let dateFormatter = DateFormatter()
        let preposition = NSLocalizedString("of", comment: "Preposition of dates formatted")
        dateFormatter.dateFormat = "dd '\(preposition)' MMMM"
        dateFormatter.locale = Locale.current

        if let date = dateFormatter.date(from: self) {
            let dateString = dateFormatter.string(from: date)
            return dateString
        }

        return nil
    }
}

然后使用它:

myLabel.text = thatString.toDate

但是.toDate总是returnnil

注:我在本站找到的答案都是ISO格式字符串的情况

预期结果:

7 月 17 日

基本上你需要一个输入日期格式和一个输出日期格式。

extension String {
    var toDate: String? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyyMMddZ"

        if let date = dateFormatter.date(from: self) {
            let preposition = NSLocalizedString("of", comment: "Preposition of dates formatted")
            dateFormatter.dateFormat = "dd '\(preposition)' MMMM"
            let dateString = dateFormatter.string(from: date)
            return dateString
        }

        return nil
    }
}

我完全同意 rmaddy 使用 setLocalizedDateFormatFromTemplate

的评论

日期字段符号的来源是unicode.org: Date Format Patterns

如果你愿意,可以把它变成扩展:

// function
func formatDate(_ from:String, preposition:String) -> String? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyyMMddZ"
    guard let date = dateFormatter.date(from: from) else {
        return nil
    }
    dateFormatter.dateFormat = "dd '\(preposition)' MMMM"
    return dateFormatter.string(from: date)
}

// example usage
let str = "20190717-0300"
if let formatted = formatDate(str, preposition: "of") {
    print(formatted)
}