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

Posted

技术标签:

【中文标题】如果给定的日期格式发生变化,如何格式化日期字符串【英文标题】: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 【参考方案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"

【讨论】:

以上是关于如果给定的日期格式发生变化,如何格式化日期字符串的主要内容,如果未能解决你的问题,请参考以下文章

如果开始日期和结束日期跨越一个或多个月,则插入表格时日期格式会发生变化

服务器中的日期格式正在发生变化

java 字符串转换成日期

excel日期变数字为啥要点一下编辑栏才能变

为啥将数据导出到 Excel 时日期格式会发生变化?

当我打开 Visual Studio 时,MFC 日期时间选择器格式发生变化