【问题标题】:Getting crash on date format日期格式崩溃
【发布时间】:2018-08-23 06:07:25
【问题描述】:

我在检查日期时崩溃了:

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)

我收到nil fromDt

我的约会对象是2018-08-16 15:04:17

【问题讨论】:

  • date 的确切值是多少?而且您不能尝试将空字符串解析为日期,因为它会失败。
  • 我的日期是 2018-08-16 15:04:17
  • hh 更改为 HH。 (12 小时对 24 小时)。在解析固定格式日期字符串时,始终将日期格式化程序的语言环境设置为en_US_POSIX
  • @rmaddy 我改变了。我的 fromDt 仍然只剩下零
  • 检查您传递给函数“cehckForDate”的日期是否不为零。此外,如果您每次都会获得日期,则无需将其设为可选。

标签: ios swift date dateformatter


【解决方案1】:

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

func checkForDate(date: String = "") -> Int{
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    guard let validDateFound = dateFormatter.date(from: date) else {
        print("Invalid date received. Please check if the date matches the date format - \(date)")
        return -1 //Proper error code for invalid date
    }
    let order = Calendar.current.compare(Date() , to: validDateFound, toGranularity: .day)
    switch order {
    case .orderedAscending:
        return(2)
    case .orderedDescending:
        return(1)
    case .orderedSame:
        return(0)
    }
}

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

另外不要强行打开。安全地解包并处理无效日期输入的错误情况。


您可以查看link 了解有关日期格式的更多信息。

【讨论】:

    【解决方案2】:

    @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)
        }
    }
    

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

    【讨论】:

    • 我试过了 我的fromDt 我的设备日期和时间在一般设置下仍然为零,因为 24 小时时间是关闭的。如果我让它打开它就可以了。但是,如果我将 12 小时时间切换按钮设为关闭,那么我只会得到零。我怎样才能知道用户是关闭还是打开..基于此我该如何显示
    • @david 检查我的答案,它解决了这个问题以及您的方法的许多其他问题。
    • 添加 locale 在这种情况下会有所帮助。 @RakeshaShastri 也以适当的方式回答了。
    猜你喜欢
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2010-11-03
    • 2017-12-17
    相关资源
    最近更新 更多