如何在这种格式的日期中转换此字符串?

时间:2019-07-29 18:06:48

标签: swift string dateformatter

我正在使用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总是返回nil

注意:我在网站上找到的答案是带有ISO格式字符串的情况。

预期结果:

7月17日

2 个答案:

答案 0 :(得分:1)

基本上,您需要一个 input 日期格式和一个 output 日期格式。

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

答案 1 :(得分:0)

如果愿意,可以将其扩展为

// 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)
}