ios swift nsdate nsdateformatter

ios - Convertir cadena con formato desconocido(cualquier formato) a la fecha



swift nsdate (2)

Probado en 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 } }

Prueba:

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

Tengo datos que contienen una cadena de fecha.

Normalmente sería en enero. 3, formato tipo 1966 '', pero debido a las diferencias internacionales, puede que no siempre sea exactamente eso.

Necesito leer los datos y convertirlos en una cadena de fecha estándar (''AAAA-MM-DD'').

Básicamente esto es lo que tengo hasta ahora:

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


Xcode 9 • Swift 4 o Xcode 8.3.2 • Swift 3.1

Puede usar NSDataDetector de la siguiente manera:

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} } }

Pruebas:

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 }