2015-09-15 19 views
6

Bir veri dizesi içeren verilerim var.Dize ile bilinmeyen bir biçime (herhangi bir biçimde) dönüştürme dönüştürün

Normalde 'Jan. olurdu. 3, 1966 'tipi format, ancak uluslararası farklılıklar nedeniyle, her zaman tam olarak bu olmayabilir.

Verileri okumanız ve standart bir tarih dizgisine dönüştürmem gerekiyor ('YYYY-AA-GG').

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

Lütfen sorununuzu ve denediğiniz çözümü içeren bazı kod parçacıkları ekleyin. – Nishant

+0

Kodunuzda işlemek istediğiniz tarih formatının diğer olası değerleri nelerdir? – Nishant

+0

Tüm olası varyasyonları bilmiyorum, ancak '3 Ocak 1966' veya '3 ​​Ocak 1966' veya '3 ​​Ocak 1966' gibi şeyler olabilir. – user49hc

cevap

22

Xcode 9 • Swift Swift 3.1

Sen aşağıdaki gibi NSDataDetector kullanabilirsiniz

• 4 veya Xcode 8.3.2:

Temelde bu defa ne var

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

Test:

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

Emin değilim, ancak "Jan. 3, 1966" gibi biçimlendirilmiş bir tarihe bağlı dateFormat "LLL. Dd, yyyy" değil. Bu diğer formatlardaki dizelerle çalışır mı? – user49hc

+1

Bence en iyi bahsiniz muhtemelen NSDataDetector –

+1

olacaktır. Teşekkürler! Çözümünüz harikaydı. – user49hc

-1

MKDataDetector, NSDataDetector'un üzerine kurulmuştur ve böylece bunu gerçekleştirmek için herhangi bir uygulamadan vazgeçmenize izin verir. Ayrıca verilerin uygun şekilde algılanmasını sağlamak için String'u da genişletir.

İlgili konular