Swift:将字符串日期数组转换为格式化字符串日期

Swift: Convert Array of String dates into Formatted String dates

所以我有一个已经格式化为字符串的日期数组。但我想进一步格式化它。我目前拥有的打印结果为零。我希望能够将其转换为“2020 年 6 月 23 日”或“6 月 23 日”等内容。我错过了什么?

let dates = ["2020-06-23", "2021-06-24", "2022-06-25", "2020-06-26", "2020-06-29"]

for i in dates {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd"
let date = dateFormatter.date(from: i)
print(date)
}

找到解决方案。您首先将其转换为日期,然后再次将这些日期转换为格式化字符串。我将初始 dateFormatter 的格式错误为“dd”。

let dates = ["2020-06-23", "2020-06-24", "2020-06-25", "2020-06-26", "2020-06-29"]
var formattedDates = [Date]()

for i in dates {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
if let date = dateFormatter.date(from: i) {
formattedDates.append(date)
  }
}

print(formattedDates)          //prints [2020-06-23 04:00:00 +0000, 2020-06-24 04:00:00 +0000, 2020-06-25 04:00:00 +0000, 2020-06-26 04:00:00 +0000, 2020-06-29 04:00:00 +0000]

首先你得到正确的格式。然后你就可以改了。

您可以使用

let dates = ["2020-06-23", "2021-06-24", "2022-06-25", "2020-06-26", "2020-06-29"]

//create an empty array of dates
var datesFormated = [Date]()

let initialDateFormatter = DateFormatter()
initialDateFormatter.dateFormat = "yyyy-MM-dd"

for i in dates {
    let date = initialDateFormatter.date(from: i)!
    //but you have to make sure that the date format of the strings match the date formatter, otherwise it will crash
    
    datesFormated.append(date)
}

//then change the format to the one you need
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM d, yyyy"

for date in datesFormated {
    
    let date = dateFormatter.string(from: date)
    
    print(date)
    

}

输出将是

Jun 23, 2020
Jun 24, 2021
Jun 25, 2022
Jun 26, 2020
Jun 29, 2020

希望对您有所帮助。

我是在您 post 回答您的答案时写的,但我会 post 无论如何,因为方法略有不同。

我建议同时使用 DateFormatter.date(from: string)DateFormatter.string(from: date)。换句话说,构建 两个 不同的日期格式化程序:一个以“yyyy-MM-DD”格式读取您的日期,另一个以不同的格式生成字符串。然后,您可以根据需要更改每个格式化程序,甚至可以使用包装此代码的方法,您可以在其中插入不同的格式化程序或格式字符串,从而在您想要更改格式时变得灵活。

此外,无需在每次执行循环时都实例化一个新的格式化程序。

    let dates = ["2020-06-23", "2021-06-24", "2022-06-25", "2020-06-26", "2020-06-29"]
    
    // use this formatter to read in dates from initial strings
    let originalDateFormatter = DateFormatter()
    originalDateFormatter.dateFormat = "yyyy-MM-dd"
    
    // use this formatter to generate new strings from dates
    let newDateFormatter = DateFormatter()
    newDateFormatter.dateFormat = "MMMM d" // or choose whatever new string format you want
    
    for i in dates {
        if let date: Date = originalDateFormatter.date(from: i) {
            let dateInNewStringFormat: String = newDateFormatter.string(from: date)
            print(dateInNewStringFormat) // prints as "June 23"
        }
    }

首先,每次迭代都初始化DateFormatter是非常浪费的。使其保持不变或静态,并且仅在需要时更改格式。 其次,在使用 DateFormatter 时,您应该始终将其视为 transformation,其中日期到字符串,反之亦然,但您不能将一个字符串直接转换为另一个字符串。在您的情况下,您需要:

string > date > string

所以基本代码如下所示:

let dates = ["2020-06-23", "2021-06-24", "2022-06-25", "2020-06-26", "2020-06-29"]
let dateFormatter = DateFormatter()

for i in dates {

    // string > date
    dateFormatter.dateFormat = "YYYY-MM-dd"
    guard let fromDate = dateFormatter.date(from: i) else {
         // not a valid date, skip
         continue
    }
 
    // date > string
    dateFormatter.dateFormat = "MMM, YYYY" // or whatever you need
    let toDate = dateFormatter.string(from: fromDate)
    print(toDate)
}

而且,如果您在代码中的多个位置使用相同的格式,最好创建一个扩展:

extension Date {

    static let dateFormatter = DateFormatter()

    // If you are dealing with the same date as input often, you can do this:
    init?(fromDateOnlyString: String) {
         Date.dateFormatter.dateFormat = "YYYY-MM-dd"
         guard let date = Date.dateFormatter.date(from: fromDateOnlyString) else {
            return nil
        }

        self = date
    }

    // If you need the same output format often, you can do this:
    func toMyDesiredFormat() -> String {
        Date.dateFormatter.dateFormat = "MMM, YYYY" // Or whatever you need
        return Date.dateFormatter.string(from: self)
    }
}

然后你像这样使用这个扩展:

for i in dates {
    guard let fromDate = Date(fromDateOnlyString: i) else {
        // not a valid date, skip
        continue
    }
    let toDate = fromDate.toMyDesiredFormat()
    print(toDate)
}

试试:

let dates = ["2020-06-23", "2021-06-24", "2022-06-25", "2020-06-26", "2020-06-29"]
var datesFormated = [Date]()

let initialDateFormatter = DateFormatter()
let dateFormatter = DateFormatter()
initialDateFormatter.dateFormat = "yyyy-MM-dd"
dateFormatter.dateFormat = "MMM d, yyyy"

dates.forEach {
    datesFormated.append( initialDateFormatter.date(from: [=10=])! )
}

datesFormated.forEach {
    print(dateFormatter.string(from: [=10=]))
}

输出:

Jun 23, 2020
Jun 24, 2021
Jun 25, 2022
Jun 26, 2020
Jun 29, 2020