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

时间:2016-12-22 05:56:24

标签: swift swift3 nsdateformatter

查看类似的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]

我已经尝试迭代日期字符串数组但是我收到了这个错误:

  

"致命错误:在展开可选值时意外发现nil"

所以我尝试使用可选绑定但没有成功。请告诉我可能出错的地方。

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语句打印"无法转换为日期对象"

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")
    }
}

5 个答案:

答案 0 :(得分:6)

在第二种情况下,你强制包装非可选值而不需要它,并且你正在使用未声明为实例属性的dateObjects bb编写self,你也可以简单地使用{{1}从var数组中减少代码并创建flatMap数组。

Date

答案 1 :(得分:1)

试试这个:date对象是局部变量,所以删除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)

答案 2 :(得分:1)

只需从dateObjects删除自己。

dateObjects是局部变量。所以不要将自己与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!)  
 }

答案 3 :(得分:1)

我所做的是,我在数组上进行了映射,并将每一项变成一个新的Date对象。

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

就这么简单。就我而言,我试图将日期与另一个日期数组进行比较,因此在执行new Date(dateString)之后,我通过执行

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

注意:
您不需要使用_.map,只需使用.map

答案 4 :(得分:0)

试试这个..

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]))
}