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

时间:2020-06-30 20:07:37

标签: swift date date-formatting

所以我有一个日期数组,这些日期已经被格式化为字符串。但我想进一步格式化它。我目前所打印的内容为零。我希望能够将其转换为“ 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)
}

5 个答案:

答案 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]