3

形式がわからない場合、iPhone SDK を使用して日付や時刻を表す文字列を解析するにはどうすればよいですか? 可能な範囲の日付と時刻を使用できるようにするアプリケーションを構築していますが、フォーマットが「01-01-2001」ではなく「01/01/2001」だったためにアプリケーションが失敗することは避けたいと考えています。 . 時間は含まれる場合と含まれない場合があります。

これを行う方法はありますか?日付と時刻のスタイルを「NoStyle」に設定し、setLenient = YES で NSDateFormatter を使用しようとしましたが、最も単純な文字列「1/22/2009 12:00:00 PM」を解析できません。

フォーマットを事前に知る方法はありません。ヒューリスティックにフォーマットを決定する方法が必要です。

私は .NET のバックグラウンドを持っていますが、これは new DateTime(string_in_any_format); と同じくらい簡単です。Obj-Cでこれを行う方法がわかりません。

4

3 に答える 3

5

古い投稿ですが、他の投稿で見つけたこれを処理するより良い方法があります。

次のような方法を使用できます。

  • まず、予想されるいくつかの形式で日付を解析してみます。
  • それでもうまくいかない場合は、 を使用NSDataDetectorして日付情報を検索してみてください (参照:この SO 投稿)。

これに使用したコードのサンプルを次に示します (いくつかの日付形式を期待していましたが、これまでに見た唯一の日付であると確信できず、可能であれば失敗したくありませんでした):

// 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 :(
于 2016-03-15T17:26:55.633 に答える
4

残念ながら、NSDateFormatteriPhoneではそれほどスマートではありません。あなたはそれに少しのガイダンスを与える必要があります。日付と時刻の両方のスタイルを設定すると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);
于 2010-08-14T21:54:18.280 に答える
0

潜在的なパーサーは、2010年1月2日が2010年1月2日であるかどうかをどのように判断しますか。2010年2月1日; またはまったく異なる何か?顧客がどこにいるかにもよりますが、mm / dd/yyとdd/mm/yyの両方を期待するのが妥当です。

于 2010-08-14T23:46:12.130 に答える