我想在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
。我在上面的片段中做了什么正确的方法吗?我想我可能会为看似如此简单的事情做太多的工作,你如何解决这个安排,以便我不必将1
和today
分成组件并将它们放回{ {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