ios - 在一周内找到即将到来的生日

时间:2013-02-28 19:06:39

标签: iphone ios objective-c cocoa

我想在iOS上找一周即将到来的生日。我从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-我在此代码中有一个错误,如果到新年不到一周,我将无法在新的一年中显示生日,因为我将生日的年份设置为对于新年的生日,当前年份和difference.day将小于0。我该如何解决这个问题?

2-从上面的代码片段我可以看到我正在做很多跳舞:首先我用[NSDate date]得到今天的日期和时间,然后我把它扯到它的组件并将它组装回{ {1}}中午时间而不是当前时间。我这样做的原因是,如果NSDate返回时间为23:00:00的日期,并且生日时间是00:00:00(1小时后,意味着生日是明天) ,然后[NSDate date]等于difference.day而不是所需的0。我在上面的片段中做了什么正确的方法吗?我想我可能会为看似如此简单的事情做太多的工作,你如何解决这个安排,以便我不必将1today分成组件并将它们放回{ {1}}?

1 个答案:

答案 0 :(得分: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