2012-04-27 10 views
2

文字列をNSDateに変換する際に問題が発生しているので、これを行う方が簡単です。「4/26/1980」のようにフォーマットされたNSStringから日または月の整数を取得する

"dd/mm/yyyy"のような形式のNSStringを持っていますが、いくつかは年を含まず、ちょうど "dd/mm"です。

SQLiteデータベースに日と月を格納しようとしているので、これらのコンポーネントを個別に取得する必要があります。私はそれらをNSDateに変換しようとしましたが、いくつかは年を持たないので、NSDate形式と一致せず、失敗します。オリジナルのdateStringが同じ形式でないため(ダッシュではなくスラッシュを使用するため)、thisのような例の問題もありました。

アイデア?ありがとう

答えて

1

日付に年がない場合は、何を意味するのか把握する必要があります。それは現在の年、または何か他のものを想定していますか?一度それを理解したら、年を文字列に追加して日付を解析することができます。

+0

申し訳ありませんが、わかります。私はユーザーのFacebookフレンドリストから誕生日をつかんでいます。一部のユーザーには誕生日は含まれていないものもあれば、年を含まないものもあれば、 "13/2/1984"という文字列が返されるものもあります。 年が実際に必要なわけではありません。データベースに保存できるように、月と日付が必要です。 – user339946

+0

年を気にせず、ちょうど記念日にして今年を置いて、将来、実際の誕生年であると数えることができないことを覚えておいてください。 –

+0

現在の年だけを使用しないでください。日付が2月29日で、うるう年でない場合、問題が発生します。 – benzado

1

「/」をチェックするだけでは簡単ではありませんか? NSDateFormatterを使用してみてください。

+0

NSDateFormatterを使用しようとしましたが、正しく変換されていないようです。 "12/25/1987"の文字列は、何とか1986-12-21のNSDateに変わります。 – user339946

2

SQLiteのも(my SO recent post on this topicを参照)、適切なネイティブの日付タイプを持っていない、との程度まであなたはSQLiteので日付を格納することができ、それを1年が経過しても意味をなさない。 NSDateを1年も持たなくても意味がないかどうかはわかりません。

個人的には、データベースに別々の数値フィールドとして3つのフィールドを1日、月、および年として保存して、その年が何歳であるのかわからない場合は空白にします。 @benzadoにより示唆されるようにこのように、単純なNSScannerを使用します。

int day; 
int month; 
int year; 

NSScanner *scanner = [NSScanner scannerWithString:birthdayString]; 

if ([scanner scanInt:&month] && 
    [scanner scanString:@"/" intoString:nil] && 
    [scanner scanInt:&day]) 
{ 
    // found valid month/day 

    if ([scanner scanString:@"/" intoString:nil] && 
     [scanner scanInt:&year]) 
    { 
     // found year too 
    } 
} 

それとも@Jacobによって示唆されているように文字列の配列にそれを得るためにNSStringののcomponentsSeparatedByStringを使用します。

NSString *monthString, *dayString, *yearString; 

NSArray *dateComponents = [birthdayString componentsSeparatedByString:@"/"]; 

if ([dateComponents count] >= 2) 
{ 
    monthString = [dateComponents objectAtIndex:0]; 
    dayString = [dateComponents objectAtIndex:1]; 

    // found month and day 

    if ([dates count] == 3) 
    { 
     yearString = [dateComponents objectAtIndex:2]; 

     // found year, too 
    } 
} 
+0

質問は、日付の格納方法ではなく、文字列表現の解析についてです。 – benzado

+0

NSDatesでできることについてたくさんの議論がありました。私は誰もがそれに固執していると思っていました。しかし、おそらく正しいと思います。@ user339946は、 "mm/dd"または "mm/dd/yyyy"の形式の文字列から日、月、年を取得する方法を知りました。私はそれに応じてあなたの答えを修正しました。 – Rob

3
NSString *dateString = @"01/04/1981"; 
NSArray *dateComponentsArray = [dateString componentsSeparatedByString:@"/"]; 
NSString *monthString = [dateComponentArray objectAtIndex:0]; 
NSString *dayString = [dateComponentsArray objectAtIndex:1]; 
if ([dateComponentsArray objectAtIndex:2]) { 
    NSString *yearString = [dateComponentsArray objectAtIndex:2]; 
} 

NSFormatterはそうそれはかなり高価なので過剰な殺人のように。フォーマットに変更を加えないと確信できるなら、これはうまくいくはずです。

2

good ol 'fashioned NSScannerを使用できます。

NSScanner *scanner = [NSScanner scannerWithString:x]; 
int month, day; 
if (
    [scanner scanInt:&month] && 
    [scanner scanString:@"/" intoString:nil] && 
    [scanner scanInt:&day] 
) { 
    NSLog(@"Got month = %d and day = %d", month, day); 
} 

私はメモリから書いているので、これをドキュメントと照合してください。

関連する問題