如何快速将 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 转换为 MM-dd-yyyy

Posted

技术标签:

【中文标题】如何快速将 yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\' 转换为 MM-dd-yyyy【英文标题】:How to convert yyyy-MM-dd'T'HH:mm:ss.SSS'Z' to MM-dd-yyyy in swift如何快速将 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 转换为 MM-dd-yyyy 【发布时间】:2020-03-06 07:57:21 【问题描述】:

您好,我需要更改日期格式

我收到来自后端的响应

dob = "1989-03-06T00:00:00Z";

就我而言,我编写了以下代码,但我的应用程序崩溃了,我认为我当前的日期格式是错误的。

func DateFromWebtoApp(_ date: String) -> String 
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    let date = dateFormatter.date(from: date)
    dateFormatter.dateFormat = "MM-dd-yyyy"
    return  dateFormatter.string(from: date!)

【问题讨论】:

尝试将格式更改为dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 不,我也已经尝试过这种方式 @ghrixghrix - 我是否正确假设此生成的 MM-dd-yyyy 字符串用于在您的 UI 中显示? 【参考方案1】:

请查看日期字符串。没有毫秒(S),Z 是格式说明符(没有单引号)。

进一步为任意日期格式添加一个固定的Locale

func dateFromWebtoApp(_ dateString: String) -> String 
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from: dateString)
    dateFormatter.dateFormat = "MM-dd-yyyy"
    return dateFormatter.string(from: date!)

【讨论】:

【参考方案2】:

试试这个,它对我有用。

func DateFromWebtoApp(_ date: String) -> String

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from: date)
    dateFormatter.dateFormat = "MM-dd-yyyy"
    dateFormatter.timeZone = .current
    return  dateFormatter.string(from: date!)

【讨论】:

您是否尝试使用 dateFormatter time zome 作为当前时间?【参考方案3】:

由于输入日期字符串采用 ISO 投诉日期格式,您可以使用 ISO8601DateFormatter

func dateFromWebtoApp(_ inDate: String) -> String? 
    let inFormatter = ISO8601DateFormatter()
    if let date = inFormatter.date(from: inDate) 
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM-dd-yyyy"
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        return dateFormatter.string(from: date)
    
    return nil

由于构建日期格式化程序有点昂贵,因此可能值得在函数之外声明它们并尽可能保留它们

【讨论】:

【参考方案4】:

众所周知,日期格式化程序的创建需要大量计算。更改dateFormat 的计算成本也很高。因此,我建议您预先声明两个日期格式化程序属性,并将它们实例化一次且仅一次。

let isoDateFormatter = ISO8601DateFormatter()

let dobFormatter: DateFormatter = 
    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    return formatter
()

第一个 isoDateFormatter 用于将后端的字符串转换为 Date 对象。通过使用ISO8601DateFormatter,它可以让您摆脱为DateFormatter 手动配置locale 的工作。

第二个,dobFormatter 用于将出生日期Date 对象转换为要在 UI 中显示的字符串。对于第二个格式化程序,请注意:

我不使用dateFormat,而是使用dateStyle(因此结果符合特定设备的日期本地化首选项,英国用户将看到“6 Mar 1989”,但美国用户将看到“Mar 6, 2019 ”)。如果您真的希望看到英国用户的dd/MM/yy 和美国用户的MM/dd/yy,请使用.short 而不是.medium。但我个人喜欢中等格式,因为它既相当简洁又完全不含糊。当然,如果我有空格,我会使用长格式,它最自然地表示日期(例如“2019 年 3 月 6 日”而不是“2019 年 3 月 6 日”)。做任何你的 UI 要求。

但是,如果这是为了向最终用户展示,您确实应该避免使用硬编码的日期格式字符串,因为用户希望看到的日期显示方式与其个人设备范围的本地化设置一致,而不是某个应用程序或其他喜欢。而且没有理由将您的应用仅限于美国用户,因为有一天您可能希望覆盖更广泛的受众。

我将此输出格式化程序的时区设置为 GMT,因为此字符串表示日期,而不是组合的日期/时间。例如,1989-03-06T00:00:00Z,即格林威治标准时间 1989 年 3 月 6 日午夜,对于我们在加利福尼亚州来说,转换为 3 月 5 日下午 4 点。但是当你显示生日时,你想说的是 3 月 6 日,而不是 3 月 5 日。简而言之,您想忽略时间和时区信息。为此,您可以使用 GMT/UTC/Zulu 作为输出日期格式化程序。

无论如何,你会像这样使用它:

let input = "1989-03-06T00:00:00Z"
if let dob = isoDateFormatter.date(from: input) 
    let output = dobFormatter.string(from: dob)

【讨论】:

以上是关于如何快速将 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 转换为 MM-dd-yyyy的主要内容,如果未能解决你的问题,请参考以下文章

如何从日期格式“yyyy-MM-dd'T'HH:mm:ss.SSSZ”中分别获取日期、年份、小时、分钟?

Java 格式 yyyy-MM-dd'T'HH:mm:ss.SSSz 转 yyyy-mm-dd HH:mm:ss

为啥我无法解析这种日期格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ?

无法从格式“yyyy-MM-dd'T'HH:mm:ss+00:00”创建日期

将这种“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”格式的字符串转换为LocalDate

将NSDate转换为NSString