所以我有一个日期数组,这些日期已经被格式化为字符串。但我想进一步格式化它。我目前所打印的内容为零。我希望能够将其转换为“ 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)
}
答案 0 :(得分:2)
首先,您将获得正确的格式。然后您可以更改它。
您可以使用
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
希望这会有所帮助。
答案 1 :(得分:2)
尝试:
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: $0)! )
}
datesFormated.forEach {
print(dateFormatter.string(from: $0))
}
输出:
Jun 23, 2020
Jun 24, 2021
Jun 25, 2022
Jun 26, 2020
Jun 29, 2020
答案 2 :(得分:1)
在您发布答案时我正在写这篇文章,但是无论如何我都会发布,因为方法略有不同。
我建议同时使用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"
}
}
答案 3 :(得分:1)
首先,在每次迭代中初始化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)
}
答案 4 :(得分:0)
找到了解决方案。您首先将其转换为日期,然后再次将那些日期转换为格式化的字符串。我将初始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]