2015-09-15 58 views
6

我有包含日期​​字符串的數據。將未知格式(任何格式)的字符串轉換爲日期

通常情況下它會在'Jan. 3,1966'型格式,但由於國際差異,它可能並不總是如此。

我需要讀取數據並將其轉換爲標準日期字符串('YYYY-MM-DD')。

基本上這是我到目前爲止有:

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

請添加一些代碼片段與您的問題的例子和您可能已經嘗試的解決方案。 – Nishant

+0

您想要在代碼中處理的日期格式的其他可能值是什麼? – Nishant

+0

我不知道所有可能的變化,但可能是'1966年1月3日'或'1966年1月3日'或'1966年1月3日'。 – user49hc

回答

22

的Xcode 9•斯威夫特4的Xcode 8.3.2•斯威夫特3.1

您可以使用NSDataDetector如下:

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

測試:

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

我不確定,但不是dateFormat「LLL。dd,yyyy」鏈接到格式化爲「1966年1月3日」的日期。這將與其他格式的字符串一起工作嗎? – user49hc

+1

我認爲你最好的選擇可能是NSDataDetector –

+1

謝謝!你的解決方案很棒。 – user49hc

-1

MKDataDetector建立在NSDataDetector之上 - 因此讓您放棄任何實現來完成此任務。它還擴展String以提供方便的數據檢測。

相關問題