【问题标题】:DateFormater error only when running on iOS 13仅在 iOS 13 上运行时出现日期格式错误
【发布时间】:2019-09-25 06:56:53
【问题描述】:

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

【问题讨论】:

  • 但是你到底是从哪里得到错误的?在dateObj = dateFormatter.date(from: timeDate)?
  • 变量名应该以小写字母开头,并且不能与内置类型(日期)相同。这真的是失败的代码吗,对于只将结果分配给局部变量的 void 函数有点毫无意义?

标签: ios swift nsdateformatter


【解决方案1】:

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

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

更多详情请访问https://nsdateformatter.com/

【讨论】:

    【解决方案2】:

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

    你可以在这里找到选项

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

    【讨论】:

      【解决方案3】:

      您的代码存在许多问题。没有理由从一个字符串创建两个 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

      【讨论】:

      • 代码比这复杂得多我只是尝试了这段代码来用简单的代码创建问题,但我会尝试你解决我的代码,谢谢:-),试着给你投票但是我收到此消息“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子得分。”
      猜你喜欢
      • 2023-01-31
      • 1970-01-01
      • 2020-06-19
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 2018-12-12
      • 1970-01-01
      相关资源
      最近更新 更多