Dateformatter 返回零日期

Posted

技术标签:

【中文标题】Dateformatter 返回零日期【英文标题】:Dateformatter returns nil date 【发布时间】:2018-07-13 13:02:34 【问题描述】:

我正在尝试将我从服务器返回的日期增加 3 小时。 publication.DateTime 是一个字符串,我需要先将其转换为日期,然后再进行操作。

这是我的尝试:

 let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        let date = dateFormatter.date(from:(publication.DateTime)!) //date is nil here 
        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month, .day, .hour], from: date!)
        let finalDate = calendar.date(from:components)

        let newDate = calendar.date(
            byAdding: .hour,
            value: 3,
            to: finalDate!)

我做错了什么?我试图在网上对这个问题进行研究,似乎大多数帖子都来自旧版本的 Swift,所以也许新的 Swift 中有一些东西我遗漏或做错了?

编辑:更改日期格式有效,但在字符串 onbject 中添加 3 小时的时间现在看起来像例如15:0:0 而不是之前的 12:34:17。我希望它是 15:34:17。

【问题讨论】:

发布日期时间字符串 publication.DateTime 的值是多少?这些问题绝大多数是因为它的字符串格式不完全匹配dateFormatter.dateFormat @Connor 例如像这样:“2018-07-12T12:43:17” 来自ios10+ 我们有NSISO8601DateFormatter 用于该日期格式。 每当我必须编写手动格式字符串时,我都会使用nsdateformatter.com。比翻阅 Apple 的文档更容易。 【参考方案1】:

添加 3 小时后日期中没有得到分钟和秒的原因是您没有将这些组件包含在组件数组中,请参考以下代码:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")

let date = dateFormatter.date(from:(publication.DateTime)!) 
let calendar = Calendar.current
// Here .minute and .second is added in below line which is missing in your code
let components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date!)

let finalDate = calendar.date(from:components)
let newDate = calendar.date(
                byAdding: .hour,
                value: 3,
                to: finalDate!)

【讨论】:

【参考方案2】:

您只需将yyyy-MM-dd'T'HH:mm:ssZ 更改为"yyyy-MM-dd'T'HH:mm:ss" 即可。

【讨论】:

一个问题是它增加了 3 小时的日期,但它删除了分钟和秒。如何保持原始分钟和秒与日期相关联?

以上是关于Dateformatter 返回零日期的主要内容,如果未能解决你的问题,请参考以下文章

DateFormatter 返回零

当我将字符串格式化为日期时出现错误的日期

DateFormatter 不返回“HH:mm:ss”的日期

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

字符串到日期的转换有时会使用 DateFormatter 返回 nil

DateFormatter 不转换特定日期 (Swift)