SwiftUI 日期格式

Hum*_*eld 7 xcode date formatter ios swiftui

我从 Github 获取此内容:\n https://github.com/emilioschepis/techfeed \n当我启动应用程序时,我在控制台中遇到问题:\n无法转换“2011 年 8 月 3 日星期三 09:44:00 + 0200”至今。\n并且我有一个黑屏。

\n

我 \xc2\xb4m 使用最新的 xCode 版本并更新代码。\n感谢您的回答....\n截屏

\n

解析器:

\n
import Foundation\n\nclass ReleasesParser: NSObject {\ntypealias CompletionResult = ([Release]) -> Void\n\nprivate static var formatter: DateFormatter = {\n    let formatter = DateFormatter()\n    formatter.dateFormat = "E, dd MMM yyyy HH:mm:ss z"\n    return formatter\n}()\n\nprivate var releases = [Release]()\nprivate var currentElement = ""\nprivate var currentGuid = ""\nprivate var currentTitle = ""\nprivate var currentDescription = ""\nprivate var currentPubDate = ""\nprivate var completion: CompletionResult?\n\nfunc parse(data: Data, completion: @escaping CompletionResult) {\n    self.completion = completion\n    \n    if data.isEmpty {\n        completion([])\n        return\n    }\n    \n    let parser = XMLParser(data: data)\n    parser.delegate = self\n    parser.parse()\n}\n}\n\nextension ReleasesParser: XMLParserDelegate {\nfunc parserDidStartDocument(_ parser: XMLParser) {\n    releases.removeAll(keepingCapacity: true)\n}\n\nfunc parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {\n    currentElement = elementName\n    \n    // If we are about to start a new item clear the fields\n    if currentElement == "item" {\n        currentGuid = ""\n        currentTitle = ""\n        currentDescription = ""\n        currentPubDate = ""\n    }\n}\n\nfunc parser(_ parser: XMLParser, foundCharacters string: String) {\n    switch currentElement {\n    case "guid":\n        currentGuid += string.trimmingCharacters(in: .whitespacesAndNewlines)\n    case "title":\n        currentTitle += string.trimmingCharacters(in: .whitespacesAndNewlines)\n    case "description":\n        currentDescription += string.trimmingCharacters(in: .whitespacesAndNewlines)\n    case "pubDate":\n        currentPubDate += string.trimmingCharacters(in: .whitespacesAndNewlines)\n    default:\n        break\n    }\n}\n\nfunc parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {\n    // If we are about to end an item add it to the list\n    if elementName == "item" {\n        guard let date = Self.formatter.date(from: currentPubDate) else {\n            print("Could not convert \\"\\(currentPubDate)\\" to Date.")\n            return\n        }\n        \n        let release = Release(id: currentGuid,\n                                  title: currentTitle,\n                                  description: currentDescription,\n                                  date: date)\n        \n        releases.append(release)\n    }\n}\n\nfunc parserDidEndDocument(_ parser: XMLParser) {\n    completion?(releases)\n}}\n
Run Code Online (Sandbox Code Playgroud)\n

列表视图行:

\n
import SwiftUI\n\n\nstruct ReleaseRow : View {\nvar release: Release\n\nprivate var formatter: DateFormatter = {\n    let formatter = DateFormatter()\n    formatter.dateFormat = "E, dd MMM yyyy"\n    return formatter\n}()\n\ninit(_ release: Release) {\n    self.release = release\n}\n\nvar body: some View {\n    VStack(alignment: .leading) {\n        Text(release.title)\n            .font(.headline)\n        Text("\\(release.date, formatter: formatter)")\n            .font(.subheadline)\n            .foregroundColor(.gray)\n    }\n    .frame(height: 44.0)\n}}\n
Run Code Online (Sandbox Code Playgroud)\n

小智 17

有一种更简单的方法来显示日期/时间

  • iOS 15(format参数)
  • iOS 14(formatter参数)

请参阅下面的示例:

struct TestFormat: View {
    let releaseDate = Date()
    
    static let stackDateFormat: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "E, dd MMM yyyy HH:mm:ss z"
        return formatter
    }()
    
    var body: some View {
        VStack {
           //iOS 15
         Text(releaseDate, format: Date.FormatStyle().year().month().day().weekday().hour().minute().second().timeZone())
            
           //iOS 14 and latter. 
         Text("\(releaseDate, formatter: Self.stackDateFormat)")
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

当向测试提供格式化程序时,当区域设置发生更改时,屏幕上的标签会自动更新。如果像在 UIKit 中那样手动将日期转换为字符串,则不会发生这种情况。


Ish*_*eet 6

ListViewRow 中的 dateFormat 是E, dd MMM yyyy,而 date 是 format E, dd MMM yyyy HH:mm:ss z。您必须使用此日期格式转换日期。

let formatter = DateFormatter()
formatter.dateFormat = "E, dd MMM yyyy HH:mm:ss z"
var date = formatter.date(from: "Wed, 03 Aug 2011 09:44:00 +0200")
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用日期对象来获取所需格式的字符串。