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
}