簡體   English   中英

Swift 5:DateFormatter 將字符串轉換為帶擴展名的日期

[英]Swift 5: DateFormatter Convert String to Date with Extension

我想將一個字符串轉換為日期,然后再次返回一個字符串。 我做了這個擴展,但是當我使用它時,它不能正常工作。

例如,如果我有“2020-12-10”,結果應該是“10 de Diciembre de 2020”,但是我總是得到相同的結果“22 de Diciembre de 2021”,而且它不正確。

這是我的代碼:

extension String {
    func dateFormatter(style: DateFormatter.Style) -> String? {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        formatter.timeZone = .current
        formatter.dateStyle = style
        formatter.locale = Locale(identifier: "es_AR")
        return formatter.string(from: Date())
    }
}

let dateExample = "2022-09-08" // This should be "8 de Septiembre de 2022"

let dateFormat = dateExample.dateFormatter(style: .long) // here i get "22 de diciembre de 2021"

嘗試解碼日期字符串時,擴展實例方法中的主要問題是您沒有使用self ,它表示調用該方法的字符串實例。 另一個問題是,在解析固定日期格式字符串時,您應該在設置 dateFormat 之前將日期格式化程序的語言環境設置為“en_US_POSIX”。 這將使您的日期格式化程序忽略設備區域設置和設置。 另請注意,如果您在實例方法中聲明格式化程序,則每次調用此方法時都會創建一個新的格式化程序(這是一項昂貴的操作)。 在解析沒有時間的日期時使用設備的當前時區時也要小心。 確保它真的是你想要的。 另一個問題是 dateStyle。 您應該使用 dateFormat 或日期/時間樣式。 不是他們兩個。 在解析固定日期格式時使用 dateFormat,在向用戶顯示日期時使用日期/時間styles ,如本文所示:


extension Formatter {
    static let yyyMMdd: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()
}

extension String {
    var yyyMMddToDate: Date? {
        Formatter.yyyMMdd.date(from: self)
    }
}

let dateExample = "2022-09-08"
if let date = dateExample.yyyMMddToDate {
    print(date.description(with: .current))  //   "Thursday, September 8, 2022 at 12:00:00 AM Brasilia Standard Time\n"
}

這主要是因為您總是在這一行轉換一個新的Date() object : return formatter.string(from: Date())

更改該行以return formatter.string(from: self)應該修復它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM