在Swift中将JSON yyyy-mm-ddthh:mm:ssz字符串转换为可读格式吗?

时间:2020-08-10 17:36:56

标签: swift date-format

我正在尝试将以问题(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'需要'日期?'符合“ _FormatSpecifiable””。知道如何正确执行此操作吗?

2 个答案:

答案 0 :(得分:1)

首先,您需要为格式化程序设置一些用户友好的日期格式。然后将您的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)
    }
}

答案 1 :(得分:0)

DateFormatter函数date(from:)返回一个Optional日期。如果您提供的字符串无效,则将返回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显示,因此时区可能与本地时区不同。如果要在本地时区显示它,则需要采取其他步骤。

相关问题