【问题标题】:Swift 5: DateFormatter Convert String to Date with ExtensionSwift 5:DateFormatter 将字符串转换为带有扩展名的日期
【发布时间】:2022-01-23 23:51:54
【问题描述】:

我想将一个字符串转换为日期,然后再次返回一个字符串。 我做了这个扩展,但是当我使用它时它不能正常工作。

例如,如果我有“2020-12-10”,结果应该是“10 de Diciembre de 2020”,但我总是得到相同的结果“22 de Diciembre de 2021”,而且它不正确。

这是我的代码:

extension String {
    func dateFormatter(style: DateFormatter.Style) -> String? {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        formatter.timeZone = .current
        formatter.dateStyle = style
        formatter.locale = Locale(identifier: "es_AR")
        return formatter.string(from: Date())
    }
}

let dateExample = "2022-09-08" // This should be "8 de Septiembre de 2022"

let dateFormat = dateExample.dateFormatter(style: .long) // here i get "22 de diciembre de 2021"

【问题讨论】:

  • 请查看副本。您需要分两步执行此操作。首先从字符串 (self) 中获取 Date,然后在该日期使用 string(from:)
  • 您将需要 2 个 DateFormatter,一个用于输入格式 (inputDateFormatter),一个用于输出格式 (outputDateFormatter。) 首先使用 inputDateFormatter 从字符串转换为日期。然后使用 outputDateFormatter 将该日期转换为字符串
  • return formatter.string(from: Date()),它的意思很清楚:以formatter 指定的格式返回一个字符串,日期为Date(),即“现在”(所以它是12 月22 日)。

标签: ios swift string date dateformatter


【解决方案1】:

尝试解码日期字符串时,扩展实例方法中的主要问题是您没有使用self,它表示正在调用该方法的字符串实例。另一个问题是,在解析固定日期格式字符串时,您应该在设置 dateFormat 之前将日期格式化程序的语言环境设置为“en_US_POSIX”。这将使您的日期格式化程序忽略设备区域设置和设置。另请注意,如果您在实例方法中声明格式化程序,则每次调用此方法时都会创建一个新的格式化程序(这是一项昂贵的操作)。在解析没有时间的日期时使用设备的当前时区时也要小心。确保它真的是你想要的。另一个问题是 dateStyle。您应该使用 dateFormat 或日期/时间样式。不是他们两个。在解析固定日期格式时使用 dateFormat,在向用户显示日期时使用日期/时间样式,如 post 所示:


extension Formatter {
    static let yyyMMdd: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()
}

extension String {
    var yyyMMddToDate: Date? {
        Formatter.yyyMMdd.date(from: self)
    }
}

let dateExample = "2022-09-08"
if let date = dateExample.yyyMMddToDate {
    print(date.description(with: .current))  //   "Thursday, September 8, 2022 at 12:00:00 AM Brasilia Standard Time\n"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多