【问题标题】:Date Format Error in swiftswift中的日期格式错误
【发布时间】:2017-08-24 11:02:30
【问题描述】:

我是 swift 库的新手。 我正在快速使用日历,我想在日历中显示事件。这些事件是从 Json API 获得的,但是当我比较日期时它显示错误。

这是代码

  let data = event["date"] as? String
  let newString = data?.replacingOccurrences(of: "/", with: "-")
  self.FirstData = self.EventDates[0]

比较函数

 func compareDate(date : String){
        let date = date

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
      ====>>>>Error in line 
  let dateFromString : NSDate = dateFormatter.date(from: date)! as NSDate 
        dateFormatter.dateFormat = "yyyy-MM-dd"
        let datenew = dateFormatter.string(from: dateFromString as Date)
        print("datee",datenew)

    }

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

如何比较日期或解决此问题。

【问题讨论】:

  • 您从 api 收到日期的格式。
  • 检查您在compareDate 中传递的日期。格式应为yyyy-MM-dd'T'HH:mm:ss
  • 为什么选择NSDate?并且要么你的日期格式错误,要么你需要设置DateFormatterLocale
  • 为什么要用replacingOccurrencesOf转换字符串? DateFormatter 也可以处理斜线。并且不要在 Swift 3 中使用 NSDate

标签: ios swift swift3


【解决方案1】:

试试这个:-

func convertDate(date:String) -> String {
     let dateFormatter = DateFormatter()
    let tempLocale = dateFormatter.locale // save locale temporarily
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") 
   // date format getting from server 
     dateFormatter.dateFormat = "YYYY-MM-dd'T'HH:mm:ss.SSSSSS'Z'"

    let date = dateFormatter.date(from: date)!
    //date format you want
    dateFormatter.dateFormat = "yyyy-MM-dd"
    dateFormatter.locale = tempLocale // reset the locale
    let dateString = dateFormatter.string(from: date)
    print("EXACT_DATE : \(dateString)")
    return dateString
 }

【讨论】:

    【解决方案2】:

    date(from:) 返回一个可选的Date 只是因为它可能无法正确转换给定的字符串。由于您无法确定何时发生这种情况,您不能强制解包结果 (dateFormatter.date(from: date)!),而是安全地解包可选的,即。 e.使用这个结构:

    if let dateFromString: NSDate = dateFormatter.date(from: date) as NSDate {
        ...
    }
    

    【讨论】:

      【解决方案3】:

      由于日期字符串的格式与分配给dateformatter 的格式不同,您的应用程序崩溃了。因为那个日期对象返回 nil 值。

      你强制nil 值转换NSDate 对象。因为那个应用程序崩溃了。

      你只需要改变你的比较日期方法如下:

      func compareDate(date : String) -> Date? {
          let dateFormatter = DateFormatter()
          dateFormatter.dateFormat = "MM-dd-yyyy"
          let dateFromString = dateFormatter.date(from: date)
          print("datee", dateFromString ?? "")
          return dateFromString
      }
      

      通过这样做,您可以创建Date 对象。

      【讨论】:

      • @Dhruv 试试这个代码,当您收到“11-23-2016”格式的日期时,它将用于创建日期对象。
      • 你为什么保留那些Date -> NSDate -> Date的废话?摆脱它。
      • stackoverflow.com/questions/45261579/… 我正在尝试这样做
      【解决方案4】:

      试试这个来改变日期格式

       let dateFormatter = NSDateFormatter()
       dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
       dateFormatter.timeZone = NSTimeZone(name: "GMT")
       let date = dateFormatter.dateFromString("2012-12-06 T 06:00:00 ")
      
       dateFormatter.dateFormat = "yyyy-MM-dd"
       let goodDate = dateFormatter.stringFromDate(date!)
      

      【讨论】:

      • 兄弟我可以运行这段代码 let goodDate = dateFormatter.string(from: date!) 出错
      • Foundation 类具有原生 Swift 等效项(DateFormatterTimeZone)时,为什么还要使用它们?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多