2015-09-15 11 views
6

日付文字列を含むデータがあります。日付は未知の形式(任意の形式)の文字列を変換します

通常、「Jan. 1966年3月3日の形式であるが、国際的な違いのため、必ずしも正確ではないかもしれない。

データを読み込んで標準の日付文字列( '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•スウィフトスウィフト3.1

あなたは次のようにNSDataDetectorを使用することができます

•4またはのXcode 8.3.2:

は、基本的にこれは私がこれまで持っているものです

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

私は確信していませんが、 "LLL。dd、yyyy"というdateFormatは、1966年1月3日のようにフォーマットされた日付にリンクされていません。これは他の形式の文字列でも使えますか? – user49hc

+1

あなたの最善の策はおそらくNSDataDetectorだと思います –

+1

ありがとうございます!あなたの解決策は素晴らしかったです。 – user49hc

-1

MKDataDetectorは、NSDataDetectorの上に構築されています。これにより、これを達成するための実装を除外できます。また、データの便利な検出を提供するためにStringを拡張します。

関連する問題