【问题标题】:SwiftUI Date formattingSwiftUI 日期格式化
【发布时间】:2020-07-09 12:37:29
【问题描述】:

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

我正在使用最新的 xCode 版本并更新代码。 谢谢解答....

解析器:

import Foundation

class ReleasesParser: NSObject {
typealias CompletionResult = ([Release]) -> Void

private static var formatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "E, dd MMM yyyy HH:mm:ss z"
    return formatter
}()

private var releases = [Release]()
private var currentElement = ""
private var currentGuid = ""
private var currentTitle = ""
private var currentDescription = ""
private var currentPubDate = ""
private var completion: CompletionResult?

func parse(data: Data, completion: @escaping CompletionResult) {
    self.completion = completion
    
    if data.isEmpty {
        completion([])
        return
    }
    
    let parser = XMLParser(data: data)
    parser.delegate = self
    parser.parse()
}
}

extension ReleasesParser: XMLParserDelegate {
func parserDidStartDocument(_ parser: XMLParser) {
    releases.removeAll(keepingCapacity: true)
}

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
    currentElement = elementName
    
    // If we are about to start a new item clear the fields
    if currentElement == "item" {
        currentGuid = ""
        currentTitle = ""
        currentDescription = ""
        currentPubDate = ""
    }
}

func parser(_ parser: XMLParser, foundCharacters string: String) {
    switch currentElement {
    case "guid":
        currentGuid += string.trimmingCharacters(in: .whitespacesAndNewlines)
    case "title":
        currentTitle += string.trimmingCharacters(in: .whitespacesAndNewlines)
    case "description":
        currentDescription += string.trimmingCharacters(in: .whitespacesAndNewlines)
    case "pubDate":
        currentPubDate += string.trimmingCharacters(in: .whitespacesAndNewlines)
    default:
        break
    }
}

func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    // If we are about to end an item add it to the list
    if elementName == "item" {
        guard let date = Self.formatter.date(from: currentPubDate) else {
            print("Could not convert \"\(currentPubDate)\" to Date.")
            return
        }
        
        let release = Release(id: currentGuid,
                                  title: currentTitle,
                                  description: currentDescription,
                                  date: date)
        
        releases.append(release)
    }
}

func parserDidEndDocument(_ parser: XMLParser) {
    completion?(releases)
}}

列表视图行:

import SwiftUI


struct ReleaseRow : View {
var release: Release

private var formatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "E, dd MMM yyyy"
    return formatter
}()

init(_ release: Release) {
    self.release = release
}

var body: some View {
    VStack(alignment: .leading) {
        Text(release.title)
            .font(.headline)
        Text("\(release.date, formatter: formatter)")
            .font(.subheadline)
            .foregroundColor(.gray)
    }
    .frame(height: 44.0)
}}

【问题讨论】:

    标签: ios xcode date swiftui formatter


    【解决方案1】:

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

    • 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)")
            }
        }
    }
    
    

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

    【讨论】:

      【解决方案2】:

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

      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")
      

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

      【讨论】:

      • 感谢您的快速答复。我还不太明白。代码是否必须在 ListViewRow 或解析器中?你能完成上面的代码吗?非常感谢您的帮助
      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2014-04-10
      • 2018-03-08
      相关资源
      最近更新 更多