日期格式化程序不从应用程序中的字符串返回日期虽然在操场上工作

Posted

技术标签:

【中文标题】日期格式化程序不从应用程序中的字符串返回日期虽然在操场上工作【英文标题】:Date formatter not returning date from string in app works in playground though 【发布时间】:2019-10-20 22:52:58 【问题描述】:

我知道这些问题一直被问到有关日期格式化程序的问题,但是我遇到的问题真的很奇怪

我需要将一个简单的字符串转换为日期,如下所示

    let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
let dateOfBirthString = "10/20/2002"
let dob: Date? = dateFormatter.date(from: dateOfBirthString)

这在操场上工作得很好,但在应用程序中总是返回 nil(使用那些确切的值(尽管是属性而不是硬编码的字符串)

任何帮助将不胜感激,这让我发疯

【问题讨论】:

在真正的应用程序中,您是否 100% 肯定字符串确实是 "10/20/2002",字符串中没有空格或任何其他字符? 我把字符串打印出来复制到操场上 这并不能确认真正的字符串是否有任何类型的空格。打印字符串的长度并确保它是 10。 (lldb) po dateOfBirthString ▿ 可选 - some : "10/20/2002" (lldb) po dateOfBirthString.count 10 似乎发生了一些奇怪的事情。刚刚尝试了您的代码,当我检查 dob 时它显示为 nil,但是当我检查它的描述时,我得到了日期的字符串表示:(lldb) e dob (Date?) $R0 = nil (lldb) e dob ?.description (String?) $R2 = "2002-10-19 23:00:00 +0000" (lldb) 【参考方案1】:
extension String 

func toDateTime() -> Date 
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    dateFormatter.timeZone = TimeZone(identifier: "UTC")
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    guard let date = dateFormatter.date(from: self) else 
        preconditionFailure("Take a look to your format")
    
    return date


试试这个扩展

let dateOfBirthString = "10/20/2002"
let dob: Date? = dateOfBirthString.toDateTime()

像这样使用此扩展程序,如果您遇到任何错误,请随时在下面发表评论

【讨论】:

嘿,谢谢这解决了它 - 仅供参考,您的第二个示例创建了一个不需要的日期格式化程序和字符串。同样对于字符串扩展,我传递了格式类型的参数,因此我可以将它用于不同的日期格式 - 谢谢这让我发疯! 好的,我明白了,很乐意为您提供帮助。 谢谢 - 非常感谢您的帮助

以上是关于日期格式化程序不从应用程序中的字符串返回日期虽然在操场上工作的主要内容,如果未能解决你的问题,请参考以下文章

小程序 在前端怎么格式化后台返回的日期数据

消除SQL ORACLE中日期的小时,分 钟和秒

C#日期格式转换

Bigquery 中的错误日期格式从字符串更改为日期

Lua日期与时间操作

如何将DataTable中的日期格式format