使用 DateFormatter().date(from: String) 时返回的日期格式化程序

Posted

技术标签:

【中文标题】使用 DateFormatter().date(from: String) 时返回的日期格式化程序【英文标题】:Date Formatter returns when using DateFormatter().date(from: String) 【发布时间】:2019-09-22 12:28:26 【问题描述】:

我有以下代码:

//converting date into desired format
    let formatterGet = DateFormatter()
    formatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss zzzz" //"2014-09-21 21:00:00  0000"
    let date = formatterGet.date(from: birthday) 
    print(date)

    // "decoding" the new format to be shown in the UI
    let formatterShow = DateFormatter()
    formatterShow.dateFormat = "MMM dd, yyyy"
    birthdayTextField.text = formatterShow.string(from: date ?? Date())

问题是当我在控制台中打印日期时,它每次都显示 nil。我该如何解决?

【问题讨论】:

在您评论的日期中,时间和时区之间有 2 个空格。这是一个错字还是它实际上是这样的? 再确认一下,你确定birthday 的格式是“2014-09-21 21:00:00 0000”的评论格式吗?此外,在评论中,“21:00:00”和“0000”之间有一个双空格 @alxlives 实际上有两个空格“21:00:00”和“0000”,但是在迁移到 ios13 之前它是这样工作的,现在它没有。我尝试了两个空格,但它仍然不起作用。 @Fogmeister 实际上有两个空格,但是当我将它们添加到 dateFormat 字符串时,它仍然返回 nil。 0000 不能被任何时区说明符解码,除非您添加 +- 符号。 zzzz 并不代表你认为的那样。见unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns 【参考方案1】:

问题在于您的DateFormatter 转换。你有两个选择:

1:从格式化程序和日期中删除zzzz

    let birthday = "2014-09-21 21:00:00"
    let formatterGet = DateFormatter()
    formatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let date = formatterGet.date(from: birthday)

    print(date)

输出:

    Optional(2014-09-22 00:00:00 +0000)

2:在日期上添加+符号:

   let birthday = "2014-09-21 21:00:00 +0000"
   let formatterGet = DateFormatter()
   formatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss zzzz"
   let date = formatterGet.date(from: birthday)

   print(date)

输出:

   Optional(2014-09-22 00:00:00 +0000)

【讨论】:

谢谢,但我尝试删除 zzzz,但它不起作用。另外,我不能将“+”添加到“0000”,因为它是从服务器返回的 @Nikkko "+0000" 表示 UTC 时间。是的,把它加回来。不要将它从您的字符串 "2014-09-21 21:00:00 +0000" 中删除并使用日期格式 "yyyy-MM-dd HH:mm:ss Z"。不要忘记将日期格式化程序语言环境设置为"en_US_POSIX",如果您需要其他方式,请将时区设置为从 gmt 开始的零秒 问题是服务器日期格式不兼容。如果服务器日期无法更改,您是否考虑过将其替换在前面,例如:birthday = birthday.replacingOccurrences(of: " 0000", with: "+0000") @alxlives 我最终使用了您的方法,到目前为止,它对我来说非常有用。非常感谢!! 如果服务器日期字符串始终以两个空格和0000 结尾,则使用"yyyy-MM-dd HH:mm:ss 0000" 作为日期格式。

以上是关于使用 DateFormatter().date(from: String) 时返回的日期格式化程序的主要内容,如果未能解决你的问题,请参考以下文章

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

swift DateFormatter

DateFormatter 返回错误的时间[重复]

DateFormatter 中的内存泄漏

昨天如何从Date()中提取今天,并将其定位为工作日和月份?

使用 DateFormatter 解析深奥的日期字符串