iPhoneの未知の形式で日付文字列を解析するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3485209

  •  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は、顧客がどこにいるかに応じて、期待するのが妥当です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top