如何更改从 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
(还有一些系统定义的格式,请参阅文档中的 dateStyle
和 timeStyle
。)
我得到一个字符串,其中包含来自 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
(还有一些系统定义的格式,请参阅文档中的 dateStyle
和 timeStyle
。)