我正在尝试计算我的通讯簿的任何联系人在接下来的 10 天内是否有生日。网上有很多代码可以比较日期,但我只想比较日期和月份。例如,如果一个联系人出生于 1960 年 5 月 1 日(假设今天是 2011 年 4 月 24 日),那么我只想计算距离他们的生日只有六天。帮助表示赞赏。
问问题
338 次
3 回答
4
将生日更改为今年(如果生日已经在今年,则更改为明年)并使用 NSDateComponents 和 NSCalendar 进行计算。
看起来有点复杂,但你可以这样做:
NSDate *birthDay = ... // [calendar dateFromComponents:myBirthDay];
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *thisYearComponents = [calendar components:NSYearCalendarUnit fromDate:[NSDate date]];
NSDateComponents *birthDayComponents = [calendar components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:birthDay];
[birthDayComponents setYear:[thisYearComponents year]];
NSDate *birthDayThisYear = [calendar dateFromComponents:birthDayComponents];
NSDateComponents *difference = [calendar components:NSDayCalendarUnit fromDate:[NSDate date] toDate:birthDayThisYear options:0];
if ([difference day] < 0) {
// this years birthday is already over. calculate distance to next years birthday
[birthDayComponents setYear:[thisYearComponents year]+1];
birthDayThisYear = [calendar dateFromComponents:birthDayComponents];
difference = [calendar components:NSDayCalendarUnit fromDate:[NSDate date] toDate:birthDayThisYear options:0];
}
NSLog(@"%i days until birthday", [difference day]);
于 2011-04-24T17:58:59.590 回答
0
对您的联系人使用以下 NSDate 功能NSDate
。
- (NSTimeInterval)timeIntervalSinceNow
上述函数返回接收者与当前日期和时间之间的时间间隔。
NSTimeInterval interval = [date1 timeIntervalSinceNow:myContactDate];
NSTimeInterval
是以秒为单位的经过时间(表示为浮点数)。然后,您可以除以 86400,这是一天中的秒数,然后四舍五入到最接近的整数。
NSInteger days = interval / 86400;
现在你有天数......
编辑:
您还可以使用NSCalendar
andNSDateComponents
仅获取两个日期之间的日期部分。
- (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
使用下面的代码作为参考。(取自 NSCalendar 的 Apple 文档)
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *startDate = ...;
NSDate *endDate = ...;
unsigned int unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *comps = [gregorian components:unitFlags fromDate:startDate toDate:endDate options:0];
int months = [comps month];
int days = [comps day];
于 2011-04-24T18:07:55.913 回答
0
于 2011-04-24T17:55:36.047 回答