使用 NSDateFormatter 快速格式化日期

Posted

技术标签:

【中文标题】使用 NSDateFormatter 快速格式化日期【英文标题】:Swift date formatting with NSDateFormatter 【发布时间】:2015-05-27 04:18:48 【问题描述】:

我有一个包含数据库日期的 json 对象:

var showDateRaw = v["feedDate"].description
println(showDateRaw)

showDateRaw 变量的类型是 String,解析 json 对象后看起来像这样: 2015-05-10T18:39:55+02:00

我想把它改成这样:2015.05.10 - 18:39

首先,我尝试使用 NSDateFormatter 转换为 NSDate:

 var formatter : NSDateFormatter = NSDateFormatter()
    formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
    let dateShow = formatter.dateFromString(v["feedDate"].description)
    println(dateShow)

然后以某种方式将此日期转换为新格式,然后将其转换为字符串。但是当我尝试打印格式化的 dateShow 变量时,它的值是 nil ..

谁能帮我把这个字符串日期转换成预期的格式?

非常感谢!

通过我尝试过的答案:

var formatter = NSDateFormatter()
            formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
            let dateShow = formatter.dateFromString(v["feedDate"].description)
            var finalFormatter = NSDateFormatter()
            finalFormatter.dateFormat = "yyyy.MM.dd HH:mm"
            let finalDate = finalFormatter.stringFromDate(dateShow!)

但它会引发错误:

致命错误:在展开可选值时意外发现 nil

你知道这是为什么吗? 谢谢。。

更新:

这是解决方案,我的 json 解析器 api 有一个 .asDate 方法,该方法返回可选的 NSDate。

let dateShow : NSDate? = v["feedDate"].asDate
            var finalFormatter = NSDateFormatter()
            finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm"
            let finalDate = finalFormatter.stringFromDate(dateShow!)
            println(finalDate)

得到它后,很容易转换为预期的格式。

非常感谢您的每一个想法!

【问题讨论】:

我没有 NSdate 对象。 或者不知道我认为v["feedDate"].description的返回值是String 你确实有 NSDate 对象。它被称为 dateShow。 检查v["feedDate"].description的值。例如使用 println。如果它是可选的,则不能将其描述传递给格式化程序。首先将其解包为常规字符串。 如果我这样做: println(dateShow) 它正在打印 nil 所以我认为我没有 String 和 NSDate :( 【参考方案1】:

let dateShow = formatter.dateFromString(v["feedDate"].description)

我会首先检查v["feedDate"] 是否不是可选的,因为在这种情况下v["feedDate"].description 可能包含类似

的字符串

Optional("2015-05-10T18:39:55+02:00") 而不是 2015-05-10T18:39:55+02:00,

显然不会转换为 NSDate...

编辑:在您的原始帖子中,您提供了以下信息:

这是打印的内容:2015-05-27T12:51:28.27+02:00 但如果我这样做 方式: println(v["feedDate"].asDate) 它打印这个: 可选(2015-05-23 14:57:43 +0000)我正在使用这个 repo 进行解析 json

你可以在 NSDateFormatter 中使用这种格式来解析它:

yyyy-MM-dd'T'HH:mm:ss.AAZZZZZ

看起来您正在使用的 API 实际上已经知道如何使用 asDate 方法对其进行日期设置。无论如何,如果您使用自己的格式化程序,请确保将正确的字符串传递给它,而不是字符串的描述?。

【讨论】:

谢谢,我认为这将是解决方案。明天我会尝试,但我相信这会奏效。谢谢!【参考方案2】:

您需要将您从 JSON 检索的日期重新格式化为您要使用的格式:

var formatter = NSDateFormatter()
formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
let dateShow = formatter.dateFromString(v["feedDate"].description)
var finalFormatter = NSDateFormatter()
finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm"
let finalDate = finalFormatter.stringFromDate(dateShow)

希望对你有帮助!

【讨论】:

这看起来是正确的答案。您需要 2 个日期格式化程序,1 个将原始字符串格式解析为 NSDate,第二个将日期转换为输出格式。我看到的唯一可能需要更改的是在输出格式的日期和时间之间添加一个破折号。 (但我不是日期格式字符串方面的专家。) @DuncanC,我也对点而不是破折号感到困惑,但我在这里对其进行了测试并且工作正常。 OP 说他/她想要像“2015.05.10 - 18:39”这样的最终输出。我将输出格式字符串设为yyyy.MM.dd - HH:mm(在日期部分和时间部分之间添加破折号。) @DuncanC 我想念那个破折号,但我现在更新它,感谢您指出这一点! @solarenqu 这可能意味着很多事情,首先确保您有一个名为“feedDate”的节点,其次确保 v["feedDate"].description 返回一个值,最后确保该值是以您尝试转换的格式。使用 println 添加一些日志以查看您实际收到的内容并将其发布在此处,以便我们帮助您找到最佳解决方案

以上是关于使用 NSDateFormatter 快速格式化日期的主要内容,如果未能解决你的问题,请参考以下文章

iphone sdk 中的 NSdateFormatter

关于NSDateFormatter的格式

NSDateFormatter 无法识别日期

NSDateFormatter 没有意义

NSDateFormatter 无法解析德语月份 March/June/Jul 的三个字母缩写

NSDateFormatter 无法解析德语月份 March/June/Jul 的三个字母缩写