如何将日期字符串数组转换为日期对象数组,Swift

How to convert an array of date strings to an array of date objects, Swift

查看了类似的SO问题,发现Swift中没有答案,有很多专门针对日期格式化但没有与迭代结合使用的答案。

我有一个日期字符串数组,如下所示:

let dateStrings = ["2016-12-22T08:00:00-08:00", "2016-12-22T08:15:00-08:00", "2016-12-22T08:30:00-08:00"]

我想将它们转换为本地日期对象数组,如下所示

var dateObjects = [2016-12-22 21:30:00 +0530, 2016-12-22 21:45:00 +0530, 2016-12-22 22:00:00 +0530]

我尝试遍历日期字符串数组,但出现此错误:

"fatal error: unexpectedly found nil while unwrapping an Optional value"

所以我尝试了可选绑定但没有成功。请告诉我哪里可能出错。

var dateObjects = [Date]()
let dateFormatter = DateFormatter()
for date in dateStrings{
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
    let dateObject = dateFormatter.date(from: date)
    self.dateObjects.append(dateObject!)  // ERROR LINE
}

当我尝试使用可选绑定时,它会通过 else 语句打印 "Unable to convert to date object"

for date in dateStrings{
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
    if let dateObject = dateFormatter.date(from: date){
        self.dateObjects.append(dateObject!)  // ERROR LINE
    }
    else{
        print("Unable to convert to date object")
    }
}

在第二种情况下,你强制包装非可选值,没有必要,你正在用未声明为实例 属性 的 dateObjects var 编写自己,你也可以只需使用 flatMap 来减少代码并从 String.

数组创建 Date 数组
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let dateObjects = dateStrings.flatMap { dateFormatter.date(from: [=10=]) }

试试这个:日期对象是局部变量,所以删除 self。如果你想使用 self 然后将其设为全局

    let dateStrings = ["2016-12-22T08:00:00-08:00", "2016-12-22T08:15:00-08:00", "2016-12-22T08:30:00-08:00"]

    var dateObjects = [Date]()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"

    for date in dateStrings{
        let dateObject = dateFormatter.date(from: date)
        dateObjects.append(dateObject!) 
    }

    print(dateObjects)

只需将自己从 dateObjects 中删除。

dateObjects 是局部变量。所以不要将 self 与 dateObjects.

一起使用
var dateObjects = [Date]()
let dateFormatter = DateFormatter()
for date in dateStrings{
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
    let dateObject = dateFormatter.date(from: date)
   dateObjects.append(dateObject!)  
 }

试试这个..

Swift 3

let dateStrings = ["2016-12-22T08:00:00-08:00", "2016-12-22T08:15:00-08:00", "2016-12-22T08:30:00-08:00"]

func convertDate(str: String) -> Date {
    let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssxxx"
        let dateObject = dateFormatter.date(from: str)
    return(dateObject!)
}

var stringDates : [Date] = []

for date in dateStrings {
    stringDates.append(convertDate(str: dateStrings[0]))
}

我所做的是映射数组并将每个项目变成一个新的 Date 对象。

let dateObjects = _.map(dateStrings, (dateString) => new Date(dateString)

就这么简单。在我的例子中,我试图将日期与另一个日期数组进行比较,所以在执行 new Date(dateString) 之后,我通过执行

将它们转换回 ISOString
let dateObjects = _.map(dateStrings, (dateString) => new Date(dateString).toISOString()

注:
您不需要使用 _.map,您可以使用 .map