仅在ios 13上运行时发生DateFormater错误

问题描述 投票:0回答:1

我有一个将字符串转换为日期格式的函数,该函数在ios 12上可以正常工作,但在ios 13上却收到此错误“线程1:致命错误:在展开可选值时意外发现nil”这是我的代码

func ConvertDateAndTimeFormat2() {

         let timeDate = "2019-09-24 15:00:00 +0000"
         let dateFormatter = DateFormatter()
         dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss +zzzz"
         dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00")
         var dateObj:Date!
         dateObj = dateFormatter.date(from: timeDate)
         dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
         dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00")

         let timeFormatter = DateFormatter()

         timeFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss +zzzz"
         timeFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00")
         var timeObj:Date!
         timeObj = timeFormatter.date(from: timeDate)

             timeFormatter.dateFormat = "HH:mm"
             timeFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00")
             let timef = "\(timeFormatter.string(from: timeObj!))"
             let Date = "\(dateFormatter.string(from: dateObj!))"

     }
ios swift nsdateformatter
1个回答
0
投票

您的代码有很多问题。没有理由从一个字符串创建两个Date对象。只需解析原始字符串一次。然后,您可以从该日期开始以所需的格式创建日期字符串和时间字符串。

解析固定格式的日期字符串时,还应使用en_US_POSIX的特殊语言环境。解析原始日期字符串时也无需设置时区。该字符串提供了自己的时区。 +0000表示现在是UTC时间。

或者将日期转换为最终字符串时,您可能也不想提供时区。您很可能希望在用户的语言环境时区中使用字符串,而不是在某些硬编码时区中使用。

这里您的代码已被清理很多:

func convertDateAndTimeFormat2() {
    let timeDate = "2019-09-24 15:00:00 +0000"

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    if let dateObj = dateFormatter.date(from: timeDate) {
        dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
        dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00") // Probably not needed

        let timeFormatter = DateFormatter()
        timeFormatter.dateFormat = "HH:mm"
        timeFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00") // Probably not needed

        let timef = timeFormatter.string(from: dateObj)
        let datef = dateFormatter.string(from: dateObj)
        print("Date: \(datef), time: \(timef)")
    }
}

convertDateAndTimeFormat2()

输出:

日期:2019年9月24日星期二,时间:18:00

© www.soinside.com 2019 - 2024. All rights reserved.