将 JSON yyyy-mm-ddthh:mm:ssz 字符串转换为 Swift 中的可读格式?
Converting JSON yyyy-mm-ddthh:mm:ssz string to readable format in Swift?
我正在尝试将传递到我的应用程序中的字符串作为问题格式 (yyyy-mm-ddthh:mm:ssz) 中的字符串转换为用户可以理解的内容。我尝试创建一个变量来进行日期格式化:
var dateFormatter: DateFormatter {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
return formatter
}
然后我尝试按如下方式使用它:
Text("\(self.dateFormatter.date(from: self.dateToConvert))")
其中 'dateToConvert' 是传递的 JSON 字符串。我得到的错误是“实例方法 'appendInterpolation' 要求 'Date?' 符合‘_FormatSpecifiable’”。知道如何正确执行此操作吗?
首先您需要为格式化程序设置一些用户友好的日期格式。然后将您的 Date
对象转换回 String
:
dateFormatter.setLocalizedDateFormatFromTemplate("yyyyMMdd")
let text = dateFormatter.string(from: convertedDate)
并直接在 Text
中使用它:
Text(text)
编辑
这是一个简单的演示,您可以如何解析和显示 Date
:
struct ContentView: View {
@State var date: Date? = Date()
// by making `it static let` it is only computed once
static let inputDateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(abbreviation: "UTC")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" // <- do not escape `Z` (time zone)
return formatter
}()
static let outputDateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.setLocalizedDateFormatFromTemplate("yyyyMMddHHmmss")
return formatter
}()
// handling of optional `Date`
var formattedDate: String {
guard let date = date else { return "Date is nil" }
return Self.outputDateFormatter.string(from: date)
}
var body: some View {
Text(formattedDate)
.onAppear(perform: parseDate)
}
func parseDate() {
let dateStr = // your date as `String`
if let date = Self.inputDateFormatter.date(from: dateStr) {
self.date = date
} else {
print("invalid date")
}
// alternatively if you don't care about errors:
// date = Self.dateFormatter.date(from: dateStr)
}
}
DateFormatter 函数 date(from:)
return 是一个 Optional
日期。如果您提供的字符串无效,它将 return nil.
与 Swift 中的许多内容一样,您需要编写代码来处理 nil。一种方法:
let dateFromString = dateFormatter.date(from: self.dateToConvert) ?? "invalid"
print("Converted date = \(dateFromString)")
或者:
if let dateFromString = dateFormatter.date(from: self.dateToConvert) {
print("Converted date = \(dateFromString)")
} else {
print("Date string is in an invalid format.")
}
另请注意,当您登录 Date
时,它将以 UTC 显示,因此时区可能与您当地的时区不同。如果你想在你当地的时区显示它,你需要采取额外的步骤。
我正在尝试将传递到我的应用程序中的字符串作为问题格式 (yyyy-mm-ddthh:mm:ssz) 中的字符串转换为用户可以理解的内容。我尝试创建一个变量来进行日期格式化:
var dateFormatter: DateFormatter {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
return formatter
}
然后我尝试按如下方式使用它:
Text("\(self.dateFormatter.date(from: self.dateToConvert))")
其中 'dateToConvert' 是传递的 JSON 字符串。我得到的错误是“实例方法 'appendInterpolation' 要求 'Date?' 符合‘_FormatSpecifiable’”。知道如何正确执行此操作吗?
首先您需要为格式化程序设置一些用户友好的日期格式。然后将您的 Date
对象转换回 String
:
dateFormatter.setLocalizedDateFormatFromTemplate("yyyyMMdd")
let text = dateFormatter.string(from: convertedDate)
并直接在 Text
中使用它:
Text(text)
编辑
这是一个简单的演示,您可以如何解析和显示 Date
:
struct ContentView: View {
@State var date: Date? = Date()
// by making `it static let` it is only computed once
static let inputDateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(abbreviation: "UTC")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" // <- do not escape `Z` (time zone)
return formatter
}()
static let outputDateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.setLocalizedDateFormatFromTemplate("yyyyMMddHHmmss")
return formatter
}()
// handling of optional `Date`
var formattedDate: String {
guard let date = date else { return "Date is nil" }
return Self.outputDateFormatter.string(from: date)
}
var body: some View {
Text(formattedDate)
.onAppear(perform: parseDate)
}
func parseDate() {
let dateStr = // your date as `String`
if let date = Self.inputDateFormatter.date(from: dateStr) {
self.date = date
} else {
print("invalid date")
}
// alternatively if you don't care about errors:
// date = Self.dateFormatter.date(from: dateStr)
}
}
DateFormatter 函数 date(from:)
return 是一个 Optional
日期。如果您提供的字符串无效,它将 return nil.
与 Swift 中的许多内容一样,您需要编写代码来处理 nil。一种方法:
let dateFromString = dateFormatter.date(from: self.dateToConvert) ?? "invalid"
print("Converted date = \(dateFromString)")
或者:
if let dateFromString = dateFormatter.date(from: self.dateToConvert) {
print("Converted date = \(dateFromString)")
} else {
print("Date string is in an invalid format.")
}
另请注意,当您登录 Date
时,它将以 UTC 显示,因此时区可能与您当地的时区不同。如果你想在你当地的时区显示它,你需要采取额外的步骤。