ios - SwiftUI 日期格式化
问题描述
我从 Github 获取: https ://github.com/emilioschepis/techfeed 当我启动应用程序时,我在控制台中遇到问题:无法将“Wed, 03 Aug 2011 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)
}}
解决方案
您在 ListViewRow 中的 dateFormat 是E, dd MMM yyyy
,而您的 date 是 format 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")
然后,您可以使用日期对象获取所需格式的字符串。
推荐阅读
- autodesk-forge - 调用 Autodesk forge API 时出现异常
- javascript - 为什么我的阵列中的内容副本会发布?
- javascript - 反应路由器。如何检查 URL: ID 是否存在于功能组件中?
- react-native - 使用 react-native 返回数据 Image = null
- laravel - Inertia.js 中的空白页 - 控制台中没有错误
- python - 想要通过电子邮件过滤模型对象,但是过滤在 Django REST api 中不起作用
- javascript - 嵌套 JSON 数据以发送到 API
- php - laravel 中基于角色的路由问题
- java - 如何将计时器值设置到记录仪?
- google-apps-script - GOOGLE 表格中的按钮(将应用程序脚本分配给对象/图像)以启动易失性函数的重新计算