时间和日期格式化程序 SwiftUI JSON 数据

Posted

技术标签:

【中文标题】时间和日期格式化程序 SwiftUI JSON 数据【英文标题】:Time and date formatter SwiftUI JSON data 【发布时间】:2019-12-09 18:51:20 【问题描述】:

希望这是一个简单的过程。我试图在使用 SwiftUI 的 ios 应用程序中的列表中显示日期和时间。我目前遇到代码问题并收到此错误消息:Cannot convert value of type 'PostListViewModel' to expected argument type 'Data'

请在下面找到代码:

struct PostViewModel 
    var post: Post
    init(post: Post) 
        self.post = post
    
    var startTime: Date        
        let data = PostListViewModel()
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .formatted(DateFormatter.DateFormat)
        let postDate = try! decoder.decode(startTime.self, from: data)
        return self.post.startTime
        


extension DateFormatter 
    static let DateFormat: DateFormatter = 
        let formatter = DateFormatter()
        formatter.dateFormat = "MMM d"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    ()

你能看出代码有什么问题吗?

【问题讨论】:

data 变量被初始化为 PostListViewModel() 并被传递给需要 Data 类型的参数。 你的代码没有意义。请详细说明您将要完成的工作。您只能从代表 JSON stringData 中解码 Type 另外,startTime 计算属性正在计算 postDate 但正在返回 self.post.startTime 对不起,我试图做的是将开始时间转换为不同的格式,我不太清楚如何准确地做到这一点。 Json 数据的格式为 2019-11-08 20:00:00 但我希望它显示 11 月 8 日并单独获取时间。当前的代码可以做到这一点吗? 不,使用此代码是不可能的。 JSONDecoder 只能解码集合对象(数组或字典),结果postDate 无论如何都没有使用。只需使用一个日期格式化程序和两个不同的日期格式字符串或两个日期格式化程序。 【参考方案1】:

如果要将日期字符串转换为 Date,然后再转换为另一个日期字符串,请使用具有两个不同日期格式字符串的日期格式化程序

struct PostViewModel 
    var post: Post

    init(post: Post) 
        self.post = post
    

    var startTime: String        
        let formatter = DateFormatter()
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        if let date = formatter.date(from: post.startTime)       
           formatter.dateFormat = "MMM d"
           return formatter.string(from: date)
         else 
           return post.startTime
        
        

【讨论】:

哥们,你是最伟大的。这正是我想要的!几天来一直在尝试这样做。非常感谢 是否可以将时间提取到单独的字符串中? 您可以返回一个元组并应用第三种日期格式来获取时间。或者将初始字符串转换为DateComponents 很抱歉,我刚刚尝试研究 dateComponents,但是当我在代码中实现它时会导致错误,我确定我做错了什么,但我想不通出什么。我是否只需要修改上面的代码使其具有,让字符串 = dateComponents[0] 并让字符串 = dateComponents[1] 并复制日期的格式并将其更改为时间? 不,您必须调用 Calendar.current.dateComponents(: [.month, .day, .hour, .minute], from: date) 并从单个组件中组合字符串。将日期格式更改为HH:mm,然后获取时间并返回一个元组可能会更容易。

以上是关于时间和日期格式化程序 SwiftUI JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI DatePicker 在更改日期时在短日期格式和中日期格式之间跳转

从 DatePicker SwiftUI 更改选定的日期格式

springMVC返回的json日期为Long的格式化

SwiftUI 没有加载数据

将含有timestamp的json对象的毫秒数转成日期格式 ssh+jqery+json中timestamp数据问题

Jackson JSON对日期格式的解析设置