如何将字符串 UTC 日期转换为 Swift 中的 NSDate

How to convert a string UTC date to NSDate in Swift

我得到的 UTC 字符串日期类似于“2015-10-17T00:00:00.000Z”,我想将它们转换为这种格式的 NSDate "October 12th 2015 11:19:12 am"

这是我正在尝试的路线,但我似乎无法获得正确的日期格式。

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = //can't seem to get this right
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date = dateFormatter.dateFromString("2015-10-17T00:00:00.000Z")

我认为这应该可行

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let localDate = formatter.date(from: date)

这适用于 Swift 3.0 和最新的 Xcode [2017 年 4 月]

let dateString = "2017-Jan-01 12:00:00.250"
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-M-dd HH:mm:ss.SSS"
        dateFormatter.locale = Locale.init(identifier: "en_GB")
        let dateObj = dateFormatter.date(from: dateString)

        let date = dateObj
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSXXXXX"
        let currentDateTime = formatter.string(from: date!)

Swift 4码

let dateString = "2015-10-17T00:00:00.000Z"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date = formatter.date(from: dateString)

您可以找到有关日期格式的有用信息here

这个问题已经有几年了,但让我们从字面上回答。

首先DateFormatter没有为序数后缀提供格式说明符所以我们必须写一个函数

func ordinalSuffix(for day : String) -> String {
    switch day {
        case "1", "11", "21", "31": return "st"
        case "2", "12", "22": return "nd"
        case "3", "13", "23": return "rd"
        default: return "th"
    }
}

要将 iso8601 字符串转换为日期,请创建 DateFormatter,将其日历设置为 iso8601 日历并将字符串转换为 Date。由于时区已在字符串中指定,因此您无需明确设置

let dateString = "2015-10-17T00:00:00.000Z"
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
guard let date = formatter.date(from: dateString) else {
    // replace that with a proper error handling
    fatalError("Could not convert date string")
}

要将日期转换回字符串,您必须将 Locale 设置为固定值,将 am/pm 符号设置为小写版本,首先提取 day 组件序数后缀计算,然后利用 String(format 插入序数后缀。

formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.amSymbol = "am"
formatter.pmSymbol = "pm"
formatter.dateFormat = "dd"
let day = formatter.string(from: date)
formatter.dateFormat = "MMMM dd'%@' yyyy h:mm:ss a"
let output = String(format: formatter.string(from: date), ordinalSuffix(for: day))
print(output)