1

iOS で 1 週間以内に予定されている誕生日を見つけようとしています。Facebook から誕生日データを取得し、年の部分をトリミングしました (ユーザーのプライバシー設定によっては一部のユーザーが利用できない可能性があるため)。したがって、誕生日データはNSString日付形式です。@"MM/dd"

NSDateFormatter *dateFormatter = [[NSDateFormatter dateFormatterWithFormat:@"MM/dd"] retain];
NSDate *today = [NSDate date];
NSDateComponents *todayComponents = [dateFormatter.calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                                              fromDate:today];
todayComponents.hour = 13;
todayComponents.minute = 0;
todayComponents.second = 0;
today = [dateFormatter.calendar dateFromComponents:todayComponents];

[facebookFriends enumerateObjectsUsingBlock:^(NSDictionary *friend,
                                              NSUInteger idx,
                                              BOOL *stop) {

    NSDate *birthday = [dateFormatter dateFromString:[friend objectForKey:@"birthday"]];
    NSDateComponents *birthdayComponents = [dateFormatter.calendar components:NSMonthCalendarUnit | NSDayCalendarUnit
                                                                     fromDate:birthday];
    birthdayComponents.year = todayComponents.year;
    birthdayComponents.hour = todayComponents.hour;
    birthdayComponents.minute = todayComponents.minute;
    birthdayComponents.second = todayComponents.second;

    birthday = [dateFormatter.calendar dateFromComponents:birthdayComponents];
    NSDateComponents *difference = [dateFormatter.calendar components:NSDayCalendarUnit
                                                             fromDate:today
                                                               toDate:birthday
                                                              options:0];
    if (difference.day >= 0 &&
        difference.day < 7) { // 7 days in a week
        [birthdaysToShow[difference.day] addObject:friend];
    }
}];
[dateFormatter release];

dateFormatterWithFormat:のカテゴリはどこですかNSDateFormatter:

+ (NSDateFormatter *)dateFormatterWithFormat:(NSString *)formatString
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    dateFormatter.calendar = calendar;
    dateFormatter.dateFormat = formatString;
    dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];

    return [dateFormatter autorelease];
}

ここで 2 つの質問:

1- このコードにはバグがあります。新年まであと 1 週間未満の場合、誕生日の年を現在の年に設定しているため、新年の誕生日を表示できません。difference.day新年の誕生日の場合は 0 よりはるかに少なくなります。どうすれば修正できますか?

2- 上記のスニペットからわかるように、私は多くのダンスを行っています。最初に で今日の日付と時刻を取得し[NSDate date]、次にそれをコンポーネントにリッピングしてNSDate、現在ではなく正午の時刻でに戻します。時間。私がこれを行っている理由は[NSDate date]、時刻が 23:00:00 である日付を返し、誕生日の時間が 00:00:00 (1 時間後、誕生日が明日であることを意味する) の場合、代わりにdifference.day等しいためです。0希望の1。上記のスニペットで行ったことは、これを行う適切な方法ですか? 一見とても単純に見えるものに対してあまりにも多くの作業を行っているのではないかと思います.スライスtodaybirthdayてコンポーネントに戻し、それらをコンポーネントに戻す必要がないように、この配置をどのように修正しNSDateますか?

4

1 に答える 1

1

各 birthdayComponents オブジェクトに適切な年を設定します。

birthdayComponents.year=todayComponents.year; //default

if(birthdayComponents.month< todayComponents.month) birthdayComponents.year=todayComponents.year+1; //their next birthday is next year.

if(birthdayComponents.month==todayComponents.month && birthdayComponents.day<todayComponents.day) birthdayComponents.year=todayComponents.year+1; //their next birthday is next year
于 2013-02-28T19:52:12.797 に答える