iPhoneの未知の形式で日付文字列を解析するにはどうすればよいですか?
-
28-09-2019 - |
質問
フォーマットがわからない場合、iPhone SDKを使用して日付および/または時間を表す文字列を解析するにはどうすればよいですか?私は、可能な日付と時間を使用できるようにするアプリケーションを構築していますが、フォーマットは「01-01-2001」ではなく「01/01/2001」などであるため、失敗したくありません。 。時間が含まれている場合と含まれていない場合があります。
これを行う方法はありますか? 「Nostyle」に設定された日付と時刻のスタイルを使用してNSDateFormatterを使用してみましたが、setLenient =はい、それでも最も単純な文字列を解析できません。「1/22/2009 12:00:00 PM」
前もって形式を知る方法はありません。形式をヒューリスティックに決定するメソッドが必要です。
私は.NETのバックグラウンドから来ています。これは新しいDateTime(String_in_any_format)と同じくらい簡単です。しかし、OBJ-Cでこれを行う方法がわかりません。
解決
不運にも、 NSDateFormatter
iPhoneではそうではありません それ 頭いい。少しガイダンスを与える必要があります。日付と時刻の両方のスタイルをに設定するとき NoStyle
日付も時刻も見ないことを期待しています。そのうちの少なくとも1つが他のスタイルに設定する必要があります。あなたは次のようなことをすることができ、それは正常に動作するはずです(それは私のために起こります)。
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
[formatter setLenient:YES];
NSDate * date = [formatter dateFromString:@"01-01/2001"];
NSLog(@"%@", date);
他のヒント
古い投稿ですが、他の投稿で見つけたこれを処理するより良い方法があります。
次のような方法を使用できます。
- まず、予想されるいくつかの形式で日付を解析してみます。
- それがうまくいかない場合は、使用してください
NSDataDetector
日付情報を見つけようとします(参照: これは投稿です).
これに私がこれに使用したコードのサンプルは次のとおりです(私はいくつかの日付形式を期待していましたが、それが私が見た唯一の日付であり、可能であれば失敗したくなかったことを確信できませんでした):
// your date formats may vary, the OP might try "MM/dd/yyyy" and "MM-dd-yyyy", along with combos that include time info
NSArray *dateFormatsToTry = @[@"yyyy-MM-dd'T'HH:mmZZZZ", @"yyyy-MM-dd'T'HH:mm:ssZZZ"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
for (NSString * format in dateFormatsToTry) {
[dateFormatter setDateFormat:format];
NSDate *date = [[[self class] sharedDateFormatter] dateFromString:dateString];
if (date) {
return date;
}
}
// try and figure out the date if the all of the expected formats failed to
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate error:nil];
NSTextCheckingResult *result = [detector firstMatchInString:dateString options:0 range:NSMakeRange(0, [dateString length])];
if ([result resultType] == NSTextCheckingTypeDate) {
NSDate * date = [result date];
if (date) {
return date;
}
}
return [NSDate date]; // default to now :(
潜在的なパーサーは、01/02/10が2010年1月2日かどうかをどのように決定しますか。 2010年2月1日;またはまったく違うもの? bboth mm/dd/yyおよびdd/mm/yyは、顧客がどこにいるかに応じて、期待するのが妥当です。