Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JSON yyyy mm ddthh:mm:ssz字符串转换为Swift中的可读格式?_Swift_Date Format - Fatal编程技术网

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

将JSON yyyy mm ddthh:mm:ssz字符串转换为Swift中的可读格式?,swift,date-format,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 } 然后我试着使用它如下:

我正在尝试将一个以问题格式(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'符合'\u FormatSpecifiable'”。您知道如何正确执行此操作吗?

首先,您需要为格式化程序设置一些用户友好的日期格式。然后将
日期
对象转换回
字符串

dateFormatter.setLocalizedDateFormatFromTemplate("yyyyMMdd")
let text = dateFormatter.string(from: convertedDate)
并在
文本中直接使用它:

Text(text)

编辑

下面是一个简单的演示,演示如何解析和显示
日期

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)
    }
}
struct ContentView:View{
@状态变量日期:日期?=日期()
//通过使“it static”,让“it”只计算一次
静态let inputDateFormatter:DateFormatter={
let formatter=DateFormatter()
formatter.locale=locale(标识符:“en_US_POSIX”)
formatter.timeZone=时区(缩写:“UTC”)

formatter.dateFormat=“yyyy-MM-dd'T'HH:MM:ssZ”//DateFormatter函数
date(from:)
返回一个
可选的日期。如果您提供的字符串无效,它将返回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.")
}

还请注意,当您记录日期时,它将以UTC显示,因此时区可能与您的本地时区不同。如果您想在本地时区显示它,您需要采取额外的步骤。

在向用户显示日期时,您不应使用固定日期格式。顺便说一句,不需要在组件之间添加空格本地化日期格式时模板中的ents另一个问题是OP忽略了转义ZAN的日期字符串中的时区,在设置固定值之前,不要忘记将区域设置设置为“en_US_POSIX”dateFormat@pawello2222我尝试使用这个解决方案,在设置文本常量的行上,我得到“无法将“字符串”类型的值转换为预期的参数类型“日期”"作为error@nickcoding我假设
convertedDate
是您已经从JSON转换的日期。因此,它应该是
date
object.OP忽略从转义为Z的日期字符串中提取的时区。这将导致本地时间,而字符串是UTC时间。这不起作用,因为self.dateToConvert是一个日期变量nd“invalid”是一个字符串。我认为它们都需要是dates,不要将日期格式中的
Z
放在单引号中。Z用于告诉日期格式化程序将时区解析为日期的一部分。a
SwiftUI.Text
希望您为其指定值(作为
date
)和格式化程序分开。它将格式化日期本身。