如果给定的日期格式发生变化,如何格式化日期字符串

问题描述

我收到来自 api 的响应,它是日期字符串,它的格式有时会发生变化,因此我需要对其进行动态格式化,

这是我的代码

import Foundation

func format(from: String?,fromFormat: String,to: String) -> String {
    if from == nil { return "" }
    let inputDateFormatter = DateFormatter()
    inputDateFormatter.dateFormat = fromFormat
    let date = inputDateFormatter.date(from: from ?? "")
    
    let outputDateFormatter = DateFormatter()
    outputDateFormatter.dateFormat = to
    if let date = date {
        return outputDateFormatter.string(from: date)
    }
    return "not formatted"
}

let strFromApi = "2020-12-22"

print(format(from: strFromApi,fromFormat: "yyyy-MM-dd",to: "d MMM yyyy"))

如您所见,我有一个可以成功格式化的代码,这里的问题是 strFromApi 变量来自 api,并且在 2020-12-222020-12-22 00:00:00 之间变化,当它更改为 2020-12-22 00:00:00 时,我当前的代码无法再对其进行格式化。

问题:即使来自服务器的给定格式有时间,我该如何格式化?

解决方法

您可以创建两个日期格式化程序,一个有时间,另一个没有时间,并使用 nil 合并运算符在第一个失败时提供后备。关于返回最终字符串时的日期格式,您应该尊重用户的设备区域设置和设置。向用户显示日期时只需使用 dateStyle 和 timeStyle :

extension Formatter {
    static let date: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()
    static let dateAndTime: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return formatter
    }()
    static let localizedDate: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .none
        return formatter
    }()
}

extension Date {
    var localizedDate: String { Formatter.localizedDate.string(from: self) }
}

func formatted(from string: String?) -> String {
    guard 
        let string = string,let date = Formatter.dateAndTime.date(from: string) ??
                   Formatter.date.date(from: string)
    else { return "" }
    
    return date.localizedDate
}

let strFromApi = "2020-12-22 00:00:00" // "2020-12-22" //
formatted(from: strFromApi)  // "Dec 22,2020"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...