2017-08-24 123 views
0

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

这是代码

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) 

    } 

错误:致命错误:意外发现零而展开的可选值

如何比较最新或解决此问题。

+0

从api收到日期的格式。 – MinuMaster

+0

检查您在'compareDate'中传递的日期。它的格式应该是'yyyy-MM-dd'T'HH:mm:ss' –

+1

为什么要投射到'NSDate'?而且你的dateformat是错误的,或者你需要设置'DateFormatter'的'Locale'。 –

回答

0

您的应用,因为日期字符串的崩溃是不是在被分配到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对象。

+0

@Dhruv试试这个代码,它将用于在“11-23-2016”格式中收到日期时创建日期对象。 – MinuMaster

+0

你为什么要保留'日期 - > NSDate - >日期'废话铸造?只是摆脱它。 – user28434

+1

我将该方法更新为请求@user28434。 – MinuMaster

0

尝试这种改变日期格式

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!) 
+0

bro我可以运行这段代码让goodDate = dateFormatter.string(from:date!)得到错误 – Dhruv

+1

为什么当它们有本地Swift等价物时('DateFormatter'和'TimeZone')? –

0

试试这个: -

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 
} 
1

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

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