2

私は以下のような1つの配列を持っています

Birthdates(
"03/12/2013",
"03/12/2013",
"08/13/1990",
"12/09/1989",
"02/06",
"09/08",
"03/02/1990",
"08/22/1989",
"03/02",
"05/13",
"10/16",
"07/08",
"08/31/1990",
"04/14/1992",
"12/15/1905",
"08/14/1989",
"10/07/1987",
"07/25",
"07/17/1989",
"03/24/1987",
"07/28/1988",
"01/21/1990",
"10/13"
 )

すべてNSStringです

今、私はこれから別の配列を作成したいと思います。その日付が現在の年に来る場合はすべての年が2013であり、日付がすでに過ぎている場合は年を2014に変更しますか?

上記の文では、年を考慮していません。日と月のみを考慮し、今年はすでに過ぎているかどうかを確認します。

たとえば、日付が「12/15/1905」の場合は「12/15/2013」のような別の配列に変換しますが、日付が「01/01/1990」の場合は「01/01/2014」のような別の配列に変換します"bcozそれはすでに現在の日付を過ぎていますplzヘルプ事前にありがとう:)

2013年と2014年だけでなく、今後も適用されるコードが適用されるようなことをしたいと思います。

4

4 に答える 4

2

このコードはあなたのためになります:

NSArray *Birthdates=@[
                      @"03/12/2013",
                      @"03/12/2013",
                      @"08/13/1990",
                      @"12/09/1989",
                      @"02/02",
                      @"09/08",
                      @"03/02/1990",
                      @"08/22/1989",
                      @"03/02"];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [gregorian components:NSYearCalendarUnit fromDate:[NSDate date]];
NSInteger currentYear = [components year];

NSMutableArray *newBirthDates=[NSMutableArray new];

for(NSString *str in Birthdates){
    NSArray *array=[str componentsSeparatedByString:@"/"];
    if(array.count==2){
        NSString *tempString=[NSString stringWithFormat:@"%@/%d",str,currentYear];
        NSDateFormatter *dateFormatter=[NSDateFormatter new];
        [dateFormatter setDateFormat:@"MM/dd/yyyy"];
        NSDate *date=[dateFormatter dateFromString:tempString];
        if ([[NSDate date] isGreaterThanOrEqualTo:date]) {
            NSLog(@"passed->%@ *** %@",date, str);
            [newBirthDates addObject:[NSString stringWithFormat:@"%@/%d",str,currentYear+1]];
        }
        [newBirthDates addObject:tempString];
    }
    else{
        NSString *dateString=[NSString stringWithFormat:@"%@/%@/%d",array[0],array[1],currentYear];
        NSDateFormatter *dateFormatter=[NSDateFormatter new];
        [dateFormatter setDateFormat:@"MM/dd/yyyy"];
        NSDate *date=[dateFormatter dateFromString:dateString];
        if ([[NSDate date] isGreaterThanOrEqualTo:date]) {
            dateString=[NSString stringWithFormat:@"%@/%@/%d",array[0],array[1],currentYear+1];
        }

        [newBirthDates addObject:dateString];
    }
}
NSLog(@"%@",newBirthDates);

出力は次のとおりです。

DocumentBased[6632:303] (
    "03/12/2014",
    "03/12/2014",
    "08/13/2013",
    "12/09/2013",
    "02/02/2014",
    "09/08/2013",
    "03/02/2014",
    "08/22/2013",
    "03/02/2014"
)
于 2013-03-13T07:09:08.383 に答える
1

NSDateFormatterを使用して日付をフォーマットする方法、年だけを変更する方法を知っていると思います。このリンクNSDateComponentsを確認してください。日付をNSDateComponentsに分割する方法については、このStackOverflowの質問をご覧ください。

于 2013-03-13T07:05:03.267 に答える
1

このコードは、すべてのdateStringを1つの形式にフェッチするまでのAnoopVaidyaコードと同じです。しかし、Anoopコードで失敗する日付比較ロジックはここで終わりました。つまり、count==2の場合です。

これがAnoopに関する私の編集したコードです

    NSArray *Birthdates=@[
        @"03/12/2013",
        @"03/12/2013",
        @"08/13/1990",
        @"12/09/1989",
        @"02/06",
        @"09/08",
        @"03/02/1990",
        @"08/22/1989",
        @"03/02"];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy"];
        NSString *curYear = [dateFormatter stringFromDate:[NSDate date]];
        NSString *nextYear = [NSString stringWithFormat: @"%d", ([curYear intValue] + 1)];
        [dateFormatter setDateFormat:@"MM/dd/yyyy"];

        NSMutableArray *newBirthDates=[NSMutableArray new];
        for(NSString *str in Birthdates){
            NSArray *array=[str componentsSeparatedByString:@"/"];
            if(array.count==2){
                [newBirthDates addObject:[NSString stringWithFormat:@"%@/%@",str,curYear]];
            }
            else{
                [newBirthDates addObject:[NSString stringWithFormat:@"%@/%@/%@",array[0],array[1],curYear]];
            }
        }


        for(int i = 0; i < [newBirthDates count]; i++)
        {
            NSString *dateStr = [newBirthDates objectAtIndex:i];
            NSComparisonResult comResult = [[dateFormatter dateFromString:dateStr] compare:[NSDate date]];
            if(comResult == NSOrderedAscending)
            {
                [dateStr stringByReplacingOccurrencesOfString:curYear withString:nextYear];
                [newBirthDates replaceObjectAtIndex:i withObject:dateStr];
            }
        }

        NSLog(@"%@",newBirthDates);

これはすべてのシナリオで機能します...

于 2013-03-13T08:51:58.953 に答える
0

dateFormatterを使わなくても直接確認できると思います。

手順:最初にNSDateを使用して現在の日付を検索します。これを文字列に変換し、NSDateFormatterを使用して、使用している配列と同じ形式にします。

次に、条件を作成して1つずつ比較します。文字列は「/」で区切ります。if([myArray objectAtIndex:i] string close by @ "/" objectAtIndex:0)そして次のものをチェックします...必要に応じて条件を作成します

より少ないコード行でこれが好きなら、あなたが望むことを達成できることを願っています。

于 2013-03-13T07:13:56.863 に答える