Convert string with unknown format (any format) to date

两盒软妹~` 提交于 2019-11-26 04:27:30

问题


I have data that contains a date string.

Normally it would be in a \'Jan. 3, 1966\' type format, but because of international differences, it may not always be exactly that.

I need to read the data in and convert it into a standard date string (\'YYYY-MM-DD\').

Basically this is what I have so far:

var dataString = \'Jan. 3, 1966\'  
var dateFormatter = NSDateFormatter()  
dateFormatter.dateFormat = # I DON\'T KNOW THE EXACT INPUT FORMAT !
let dateValue = dateFormatter.dateFromString(dataString)  

回答1:


Xcode 9 • Swift 4 or Xcode 8.3.2 • Swift 3.1

You can use NSDataDetector as follow:

extension String {
    var nsString: NSString { return self as NSString }
    var length: Int { return nsString.length }
    var nsRange: NSRange { return NSRange(location: 0, length: length) }
    var detectDates: [Date]? {
        return try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
                .matches(in: self, range: nsRange)
                .flatMap{$0.date}
    }
}

extension Collection where Iterator.Element == String {
    var dates: [Date] {
        return flatMap{$0.detectDates}.flatMap{$0}
    }
}

Testing:

let dateStrings = ["January 3, 1966","Jan 3, 1966", "3 Jan 1966"]
for dateString in dateStrings {
    if let dateDetected = dateString.detectDates?.first {
        print(dateDetected)
        // 1966-01-03 14:00:00 +0000
        // 1966-01-03 14:00:00 +0000
        // 1966-01-03 14:00:00 +0000
    }
}


let dateStrings = ["January 3, 1966","Jan 3, 1966", "3 Jan 1966"]

for date in dateStrings.dates {
    print(date)
    // 1966-01-03 14:00:00 +0000
    // 1966-01-03 14:00:00 +0000
    // 1966-01-03 14:00:00 +0000
}



回答2:


Tested in swift 4, xcode 9

extension String {
        var detectDate: Date? {
            let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
            let matches = detector?.matches(in: self, options: [], range: NSMakeRange(0, self.utf16.count))
            return matches?.first?.date
        }
    }

Test:

print("2018-11-04T23:59:00+00:00".detectDate ?? "") // 2018-11-04 10:00:00 +0000

print("2018/11/4".detectDate ?? "") // 2018-11-04 10:00:00 +0000



来源:https://stackoverflow.com/questions/32595651/convert-string-with-unknown-format-any-format-to-date

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!