当前位置: 首页 > 知识库问答 >
问题:

在swift中从字符串格式化日期[重复]

仉刚洁
2023-03-14

我有以下来自服务器的日期<code>2019-09-05T10:37:49.494Z

它尝试这样做:

let dateFormatterGet = DateFormatter()
let dateFormatterPrint = DateFormatter()
var rawDate = "2019-09-05T10:37:49.494Z"

dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
dateFormatterPrint.dateFormat = "E, d MMM yyyy HH:mm"
var formattedDate = "Error Formatting date"
if let date = dateFormatterGet.date(from: rawDate) {
    formattedDate = dateFormatterPrint.string(from: date)
    print("Formatted Date : \(formattedDate)")
}else {
     print("There was an error decoding the string")
}

这无法打印错误消息,我做错了什么,如何修复它?

共有3个答案

钱言
2023-03-14

问题是您没有告诉dateFormatterGet如何解析毫秒。将日期格式修改为:

dateFormatterGet。dateFormat=“yyyy-MM-dd'T'HH:MM:ss.SSSZ”

柯升
2023-03-14

您提供的格式看起来像是iso 8601日期。因此,我建议使用<code>ISO8601日期格式化程序

您可以指定选项来匹配您的字符串,下面是一个示例

let dateString = "2019-09-05T10:37:49.494Z"

let formatter = ISO8601DateFormatter()

formatter.formatOptions = [
    .withDashSeparatorInDate,
    .withFullDate,
    .withFullTime,
    .withFractionalSeconds,
    .withColonSeparatorInTime
]

// "Sep 5, 2019 at 12:37 PM"
let date = formatter.date(from: dateString) ?? Date()

//"Thursday, September 5, 2019 at 12:37:49 PM"
let formattedDate = DateFormatter.localizedString(
    from: date,
    dateStyle: .full,
    timeStyle: .medium
)
罗昊空
2023-03-14

你快到了。

使用(NS)DateFormatter的一个小技巧是将dateFormat置于日期字符串的上方/下方。

yyyy-MM-dd'T'HH:mm:ssZ
2019-09-05T10:37:49.494Z

然后,添加“空格”来对齐和分隔它们。

yyyy - MM - dd 'T' HH : mm : ss      Z
2019 - 09 - 05  T  10 : 37 : 49 . 494Z
                                ^ ^^^

我突出显示了缺失的字符。您需要通过dateFormat告诉(NS)DateForware如何解释这些附加字符。

让我们检查一下文档。

它是

小数秒-截断(像其他时间字段一样)到字母数。(示例显示了使用模式SSSS显示秒值12.34567)

所以使用“嗯SSSZ应该解释它们并解决您的问题。

这就是您解决问题的方法。它解释了你的错误。但是,由于@Zombie它使用的是ISO格式,因此如果可用,请使用ISO8601日期格式(如果可能)(iOS10)如果在将来的情况下您没有ISO格式,则可以使用这些提示;)

 类似资料: