【问题标题】:Can't Convert Date Format Into Display Date In Swift无法在 Swift 中将日期格式转换为显示日期
【发布时间】:2020-11-18 00:43:08
【问题描述】:

我一直在尝试采用“Thu Nov 12 2020 07:00:00 GMT+0000(格林威治标准时间)”格式保存的日期,并将其转换为“MMM d, yyyy”的格式,但是我没有成功。

import Foundation

extension String {

//    Example date read in from database.
//    "Thu Nov 12 2020 07:00:00 GMT+0000 (Greenwich Mean Time)"
    
    func convertToDate() -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
        dateFormatter.locale = Locale(identifier: "en_US_POSSIX")
        dateFormatter.timeZone = .current
        
        return dateFormatter.date(from: self)
    }
    
    
    func convertToDisplayFormat() -> String {
        guard let date = self.convertToDate() else { return "N/A"}
        return date.convertToMonthDayTimeFormat()
    }
}


import Foundation

extension Date {
    func convertToMonthDayTimeFormat() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MMM d, yyyy"
        print(dateFormatter.string(from: self))
        return dateFormatter.string(from: self)
    }
}

然后在我读取数据的文件中,代码是

  cell.appointmentTime?.text = "\(tableData.date!.convertToDisplayFormat())"

【问题讨论】:

    标签: swift xcode dateformatter


    【解决方案1】:

    在设置 dateFormat 之前,您应该始终将 dateFormat 语言环境设置为 "en_US_POSIX"。顺便说一句,您从数据库读取的日期字符串似乎始终采用 UTC 格式,如果是这种情况,您应该将 dateFormatter 时区设置为零 secondsFromGMT 并转义您的日期字符串时区:

    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSSIX")
    dateFormatter.dateFormat = "EEE MMM dd yyyy HH:mm:ss 'GMT+0000 (Greenwich Mean Time)'"
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    dateFormatter.date(from: "Thu Nov 12 2020 07:00:00 GMT+0000 (Greenwich Mean Time)")
    

    您还应该创建一个静态日期格式化程序,以避免每次调用此方法时都创建一个新的:


    extension Formatter {
        static let customDate: DateFormatter = {
            let dateFormatter = DateFormatter()
            dateFormatter.locale = Locale(identifier: "en_US_POSSIX")
            dateFormatter.dateFormat = "EEE MMM dd yyyy HH:mm:ss 'GMT+0000 (Greenwich Mean Time)'"
            dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
            return dateFormatter
        }()
        static let yyyyMMMd: DateFormatter = {
            let dateFormatter = DateFormatter()
            dateFormatter.setLocalizedDateFormatFromTemplate("yyyyMMMd")
            return dateFormatter
        }()
    }
    

    extension String {
        func convertToDate() -> Date? {
            Formatter.customDate.date(from: self)
        }
        func convertToDisplayFormat() -> String {
            convertToDate()?.convertToMonthDayTimeFormat() ?? "N/A"
        }
    }
    

    extension Date {
        func convertToMonthDayTimeFormat() -> String {
            Formatter.yyyyMMMd.string(from: self)
        }
    }
    

    游乐场测试:

    "Thu Nov 12 2020 07:00:00 GMT+0000 (Greenwich Mean Time)".convertToDisplayFormat()  // "Nov 12, 2020"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2018-02-23
      • 2022-08-17
      • 2023-03-30
      • 2011-08-13
      • 2016-12-02
      • 2020-01-23
      相关资源
      最近更新 更多