Ios 获取日期格式的崩溃

Ios 获取日期格式的崩溃,ios,swift,date,dateformatter,Ios,Swift,Date,Dateformatter,我在检查日期时遇到了麻烦: func cehckForDate(date: String?) -> Int{ let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss" let fromDt = dateFormatter.date(from: date ?? "") let curreentDate = Date() let order =

我在检查日期时遇到了麻烦:

func cehckForDate(date: String?) -> Int{
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
    let fromDt = dateFormatter.date(from: date ?? "")
    let curreentDate = Date()
    let order = Calendar.current.compare(curreentDate , to: fromDt!, toGranularity: .day)
    switch order {
    case .orderedAscending:
        return(2)
    case .orderedDescending:
        return(1)
    case .orderedSame:
        return(0)
    }
    return 0
}
我在这里撞车:

let order = Calendar.current.compare(curreentDate , to: fromDt!, toGranularity: .day)
我从DT获得
nil


我的日期是
2018-08-16 15:04:17

就像@rmaddy说的,问题是你的日期格式和你的输入不匹配
hh
->12小时格式,
hh
->24小时格式,这正是您所需要的。(请参阅底部的链接,以检查输入需要使用的内容)

唯一无法获得正确日期的情况是,
日期
为空或与您提到的日期格式不匹配

另外,不要强制展开。安全地展开并处理无效日期输入的错误案例



有关日期格式的更多信息,请查看此项。

@rmaddy是正确的,将
hh
更改为
hh
正在工作:

func checkForDate(date: String?) -> Int{
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let fromDt = dateFormatter.date(from: date ?? "")
    let curreentDate = Date()
    let order = Calendar.current.compare(curreentDate , to: fromDt!, toGranularity: .day)
    switch order {
    case .orderedAscending:
        return(2)
    case .orderedDescending:
        return(1)
    case .orderedSame:
        return(0)
    }
}

同时删除最后一个
返回0
,因为它永远不会执行。

日期的确切值是多少?您无法尝试将空字符串解析为日期,因为它将失败。我的日期为2018-08-16 15:04:17将
hh
更改为
hh
。(12小时对24小时)。在分析固定格式的日期字符串时,请始终将日期格式化程序的区域设置设置为
en_US\u POSIX
。@rmaddy i已更改。但我的fromDt只得到nill检查是否传递给函数“cehckForDate”的日期不是nil。此外,如果您每次都会获取日期,则无需将其设置为可选。我仍然尝试在我的
fromDt
设备日期和时间的常规设置中获取nill,因为24小时时间已关闭。如果我让它切换到它的罚款。但如果我把12小时的时间切换按钮设为关闭,那么我只能得到零。我怎样才能知道用户是关闭的还是打开的..基于此,我怎样才能显示that@david检查我的答案,它解决了这个问题,也解决了您的方法中的许多其他问题。添加
locale
将在该场景中有所帮助@RakeshaShastri的回答也很恰当。
func checkForDate(date: String?) -> Int{
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let fromDt = dateFormatter.date(from: date ?? "")
    let curreentDate = Date()
    let order = Calendar.current.compare(curreentDate , to: fromDt!, toGranularity: .day)
    switch order {
    case .orderedAscending:
        return(2)
    case .orderedDescending:
        return(1)
    case .orderedSame:
        return(0)
    }
}