2

文字列を NSDate に変換する際に問題が発生したため、これを行うためのより良い/簡単な方法があるかもしれません。

「dd/mm/yyyy」のようにフォーマットされた日付の NSString がありますが、年が含まれていないものもあり、単に「dd/mm」です。

日と月を SQLite データベースに保存しようとしているので、これらのコンポーネントを個別に取得する必要があります。それらをNSDateに変換しようとしましたが、年がないものがあるため、NSDate形式と一致せず、失敗します。元の dateString が同じ形式ではない (ダッシュではなくスラッシュを使用している) ため、このような例に従っても問題が発生しました。

何か案は?ありがとう

4

6 に答える 6

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 はかなり高価なため、やり過ぎのようです。フォーマットを変更しないことが確実な場合は、これでうまくいくはずです。

于 2012-04-28T00:10:01.097 に答える
2

SQLite には適切なネイティブの日付型さえありません (このトピックに関する私の SO 最近の投稿を参照してください)。また、SQLite に日付を格納できる限り、年がなければ意味がありません。年なしで NSDate を持つことも意味がありません。

個人的には、日、月、年の 3 つのフィールドを別々の数値フィールドとしてデータベースに保存し、その人の生まれた年がわからない場合は年を空白のままにします。したがって、@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
    }
}
于 2012-04-27T23:08:43.737 に答える
2

古き良き時代を使用できます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);
}

私は記憶から書いているので、ドキュメントと照らし合わせてこれを確認してください。

于 2012-04-28T00:18:11.623 に答える
1

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

于 2012-04-27T20:54:55.633 に答える
1

これには必要な答えがあると思います:

Apple iOS 日付フォーマット ガイド

于 2012-04-27T21:12:22.770 に答える
1

そんなに単純なら、「/」をチェックすることはできませんか? NSDateFormatter も使用してみてください。役立つ場合があります。

于 2012-04-27T21:03:44.827 に答える