【问题标题】:Sometimes getting nil while converting UTC date string to timestamp有时在将 UTC 日期字符串转换为时间戳时得到 nil
【发布时间】:2020-09-21 04:04:39
【问题描述】:

有时我在将日期字符串转换为时间戳时得到 nil。

这是我的代码:

class func createTimeStampFromDateString(dateString : String) -> Double? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let convertedDate = dateFormatter.date(from: dateString)
    let timeIntervalsince1970 = convertedDate?.timeIntervalSince1970
    return timeIntervalsince1970
}

能否请您告诉我这段代码有什么问题。

提前致谢!

【问题讨论】:

  • 如果dateString 是包含小数秒和时区的 ISO8601 日期字符串,则没有任何问题
  • dateString 你得到nil 的价值是什么?
  • 日期字符串:2020-06-02T13:38:31.814Z
  • 该字符串不会为我生成nil?
  • 是的。确切地。我在运行时收到此错误。但是从后端我得到了像“yyyy-MM-dd'T'HH:mm:ss.SSSZ”这样的令人讨厌的格式。但是之前的代码是这样的:让timeIntervalsince1970 = convertDate!.timeIntervalSince1970(强制解包),这就是应用程序有时崩溃的原因。

标签: ios swift timestamp utc


【解决方案1】:

根据您的 cmets,该错误不是因为此功能(它按预期工作)。您遇到的错误(崩溃)是因为您强制解开日期值 nil,这是因为用于创建该日期的字符串不是有效格式。这就是使用应用程序外部来源的日期和字符串的本质——这些字符串不能保证格式正确。这就是为什么你的函数应该返回一个可选值。

顺便说一句,您可以简化方法并利用ISO8601DateFormatter:

func timestamp(from string: String) -> Double? {
    let df = ISO8601DateFormatter()
    df.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
    return df.date(from: string)?.timeIntervalSince1970
}

并且要正确使用它,有条件地使用它而不强制解包:

if let interval = timestamp(from: "2020-06-02T13:38:31.814Z") {
    print(interval)
}

纠正你的错误:

  1. 在处理日期/字符串转换时不要强制展开。如果字符串的格式不正确,请考虑丢弃结果,提供默认值,显示“未知”之类的内容——除了强制应用程序崩溃之外的任何内容。
  2. 确定字符串格式不正确的原因并查看是否可以纠正。

【讨论】:

  • 感谢您的回复。你能告诉我为什么那个检测字符串的格式不正确吗?
  • 我们无法弄清楚为什么日期字符串以不同的格式出现。如果您能给我们一些想法,将会非常有帮助。
  • @user8591342 字符串的来源是什么?
  • 来源是mongo db。
  • @user8591342 和那个人谈谈,告诉他你们两个需要谈谈
【解决方案2】:

当对 ISO8601 日期使用标准 DateFormatter 时,您应该在从字符串转换之前将语言环境设置为 en_US_POSIX (dateFormatter.locale = Locale(identifier: "en_US_POSIX"))。

此外,在将字符串转换为日期时,总是会发生字符串格式错误(缺少或错误的数字/字符)的情况。这里有很多地方可能出错。

但是对于 ISO8601 日期,有一个专用的ISO8601DateFormatter。它可以处理 ISO8601 格式日期的多种变体。但它仅从 iOS 10 开始可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2015-10-24
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2014-02-22
    相关资源
    最近更新 更多