无法在 Swift 中将日期格式转换为显示日期

Posted

技术标签:

【中文标题】无法在 Swift 中将日期格式转换为显示日期【英文标题】:Can't Convert Date Format Into Display Date In 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())"

【问题讨论】:

【参考方案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"

【讨论】:

以上是关于无法在 Swift 中将日期格式转换为显示日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift(ios)中将字符串格式的日期转换为另一种字符串格式[重复]

在swift 3中将字符串转换为日期类型[重复]

在 Swift 中将字符串转换为日期 [重复]

无法在JavaScript中将String BST日期格式转换为UTC

在 MySQL 中将 UTC 格式的日期时间转换为 GMT+7

如何在 Swift 5 中将“日期”转换为“数据”,反之亦然? [复制]