我正在尝试解析一些json,这是oData连接的结果,并且我从服务器收到以下响应:

"Task_ID":24,"Equipment_ID":3,"Owner_ID":2,"Priority":5,"Date_Due":
"2015-04-08T19:37:56.913","Time_Complete":"2015-04-09T19:37:56","Task_Description"

我实际上对我收到的两个不同的日期字段感兴趣:
"Date_Due":"2015-04-08T19:37:56.913"



"Time_Complete":"2015-04-09T19:37:56"

正如我们所看到的,一个具有毫秒时间戳,另一个没有。

通过查看数据库,发生这种情况是因为毫秒数实际上在数据库(MS SQL Server)中为.000,无论出于何种原因,我在json中收到的结果都被截断了。

我对毫秒不感兴趣,但是我想拥有一个可以处理两种情况的dateFormat函数。

现在,我有一个明显的答案是(预)解析每个日期字段,如果存在则删除毫秒,然后使用以下代码格式化它们:
let SQLDateFormatter: NSDateFormatter = {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
    return formatter
}()

但是我想知道我们是否可以构建一个无需预先准备就可以解决此问题的格式化程序,那么这两种格式都可以同时使用:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"


formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"

并自动正确进行格式化。

我一直在检查这个问题,但找不到任何东西,在此先感谢...

最佳答案

extension Formatter {
    static let iso8601: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        return formatter
    }()
    static let iso8601withFractionalSeconds: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        return formatter
    }()
}
extension String {
    var date: Date? {
       return Formatter.iso8601withFractionalSeconds.date(from: self) ??
            Formatter.iso8601.date(from: self)
    }
}
"2015-04-08T19:37:56.913".date  // "Apr 8, 2015, 4:37 PM"
"2015-04-09T19:37:56".date      // "Apr 9, 2015, 4:37 PM"

10-06 04:51