仅在iOS 13上运行时,DateFormater错误

时间:2019-09-25 06:56:53

标签: ios swift nsdateformatter

我有一个将字符串转换为日期格式的功能。此功能可以在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!))"
 }

3 个答案:

答案 0 :(得分:2)

请更改日期格式,然后使用“ yyyy-MM-dd HH:mm:ss Z”并尝试。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"

有关更多详细信息,请访问https://nsdateformatter.com/

答案 1 :(得分:1)

如果您尝试将字符串时间转换为24小时格式(例如15:25:00 / HH:mm:ss),请启用设备的24小时制选项。它可能会解决IOS 13.3中的问题

您可以在此处找到该选项

设置->常规->日期和时间

答案 2 :(得分: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