Swift:DateFormatter 返回 nil

Posted

技术标签:

【中文标题】Swift:DateFormatter 返回 nil【英文标题】:Swift: DateFormatter returning nil 【发布时间】:2020-05-10 10:55:11 【问题描述】:

我遇到了一个奇怪的问题,即 DateFormatter 返回 nil 以获得有效的数据字符串。

这是我的代码:

func dateFromString(_ dateString:String,  format: String = "dd/MM/yy") -> Date?

    let dueDateFormatter = DateFormatter()
    dueDateFormatter.timeZone = TimeZone(identifier: "UTC")!
    dueDateFormatter.dateFormat = format
    let date = dueDateFormatter.date(from: dateString)
    return date
 

func applicationDidFinishLaunching(_ aNotification: Notification)

    print("Launched")
    let dd = dateFromString("Aug 20", format: "MMM yy")
    print (dd!)

在调试器中:

似乎该变量已设置并且可以在应用程序中使用,但调试器没有显示它。这是 Xcode 的错误还是我要疯了?

在操场上一切正常,我在代码的其他区域多次使用此功能。

我使用的是 10.15.4 和 Xcode 11.4.1

【问题讨论】:

我从未见过有人在调试器中使用print。我一直使用popo dd 产生了什么? 调试器输出清楚地显示来自您的print(dd!)的“2020-07-31 23:00:00 +0000” 对于固定日期格式,强烈建议将格式化程序的Locale 设置为en_US_POSIX,尤其是在处理月份字符串时。 【参考方案1】:

在调试器上玩了一会后,我明白了这是为什么。

发生这种情况的原因是因为它是Date。如果您更改方法以返回 NSDate,调试器将正确显示它。

根据我的观察:这种行为发生在Date 和其他诸如TimeZone 所属的类型组中。也就是说,Foundation 中的 Swift 类型具有 Objective-C 对应项,但不是像 DateFormatter/NSDateFormatter 这样的“直接端口”。我不能很好地描述它,但基本上是 Foundation 中的类型,他们的文档页面不允许您在右上角选择 Objective-C 版本。 大多数类型都会发生这种情况this page 也在 Foundation 中。例外情况是:

AffineTransform Data DateInterval Measurement Notification

如果您使用另一个调试器命令po,您会看到它正确显示Dates。那么printpo有什么区别呢?

运行help printhelp po 可以告诉我们:

print:

    Evaluate an expression on the current thread.  Displays any returned value
    with LLDB's default formatting.  Expects 'raw' input (see 'help
    raw-input'.)

    Syntax: print <expr>

    Command Options Usage:
      print <expr>


    'print' is an abbreviation for 'expression --'

po:

    Evaluate an expression on the current thread.  Displays any returned value
    with formatting controlled by the type's author.  Expects 'raw' input (see
    'help raw-input'.)

    Syntax: po <expr>

    Command Options Usage:
      po <expr>

    'po' is an abbreviation for 'expression -O  --'

注意po 是如何表示“格式由类型的作者控制的”。如果您输入help expression,您将看到expression-O 选项的作用:

如果可能,使用特定语言的描述 API 显示。

因此可以得出结论,poprint 更“特定于 Swift”,因此它能够打印出诸如 DateTimeZones 之类的内容,因为 print 根本不会不知道如何打印 Swift Date

【讨论】:

以上是关于Swift:DateFormatter 返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

Swift DateFormatter 提取时间

您可以使用 Swift DateFormatter 获取 Date 对象,对其进行格式化,然后将其作为 Date 对象返回吗?

DateFormatter 中的 Swift 语言错误? [复制]

在swift中使用DateFormatter时发生错误[重复]

在 Swift 中使用 DateFormatter 和 TimeZone 来格式化日期

swift DateFormatter