[英]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.