如何更改从 API 获得的字符串

How to change a string I get from API

我得到一个字符串,其中包含来自 this API 的四枚火箭中每一枚的首次飞行日期。我得到的字符串如下所示:“2006-03-24”。我希望它看起来像这样:“2006 年 3 月 24 日”。我不明白如何在 SwiftUI 中执行此操作。

我对日期的看法:

struct DateView: View {
    @State var rockets = [RocketInfo]()
    
    var body: some View {
        NavigationView {
            if rockets.isEmpty {
                ProgressView()
            } else {
                TabView {
                    ForEach(rockets) { rocket in
                        VStack {
                            HStack {
                                Text("First flight")
                                Spacer()
                                Text(rocket.firstFlight)
                            }
                            .padding()
                        }
                    }
                }
                .tabViewStyle(.page)
                .navigationBarTitleDisplayMode(.inline)
                .navigationBarHidden(true)
            }
        }
        .onAppear {
            InfoApi().getRockets { rockets in
                self.rockets = rockets
            }
        }
    }
}

struct DateView_Previews: PreviewProvider {
    static var previews: some View {
        DateView()
            .preferredColorScheme(.dark)
    }
}

API数据的截图:enter image description here

函数从字符串中获取日期,然后您可以根据自己的意愿设置格式。

    var body: some View {
        let dateString = "2006-03-24"
        let date = dateFromString(dateString)
        
        Text("\(date, style: .date)")
    }
    
    func dateFromString(_ string: String) -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = .current
        dateFormatter.dateFormat = "yyyy-MM-dd"
        return dateFormatter.date(from: string) ?? Date()
    }

您需要两个 DateFormatter 实例 - 一个将字符串从 API 转换为日期实例,另一个将日期实例转换为所需的字符串格式。

let dateFormatter1 = DateFormatter() 
dateFormatter1.dateFormat = "yyyy-MM-dd" // Format of API Date

let dateFormatter2 = DateFormatter() 
dateFormatter2.dateFormat = "d MMMM, yyyy" // Desired Format

let date = dateFormatter1.date(from: "2006-03-24")!
let desiredFormat = dateFormatter2.string(from: date)
print(desiredFormat) // prints "24 March, 2006"

首先,我鼓励您将 RocketInfo 中的 firstFlight 更改为 Date 对象,以便在模型中获得正确的数据表示。您可能必须配置 JSONDecoder 才能正确解析日期字符串:

let decoder = JSONDecoder()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
decoder.dateDecodingStrategy = .formatted(formatter)

然后,当您想将该日期转换回字符串时,您需要另一个 DateFormatter

let formatter = DateFormatter()
formatter.dateFormat = "d MMMM, yyyy"
let dateString = formatter.string(from: object.firstFlight)

请在此处查看 DateFormatter 支持的自定义格式列表: http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns

(还有一些系统定义的格式,请参阅文档中的 dateStyletimeStyle。)