【问题标题】:How to format date string if the given date format changes如果给定的日期格式发生变化,如何格式化日期字符串
【发布时间】:2020-12-22 02:54:59
【问题描述】:

我从 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 之间变化,当它变为@987654325 @,我现在的代码不能再格式化了。

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

【问题讨论】:

  • 为什么不把“00:00:00”换成“”?
  • @koropok 你是什么意思?,我没有包含 00:00:00 的代码..
  • @koropok 00:00:00 只是一个例子,如果它有一个“ 11:11:11”呢?
  • 哦,这个怎么样? strFromApi.components(separatedBy: " ").first

标签: swift nsdateformatter dateformatter


【解决方案1】:

您可以创建两个日期格式化程序,一个带时间,另一个不带时间,并使用 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多