1

我正在尝试计算我的通讯簿的任何联系人在接下来的 10 天内是否有生日。网上有很多代码可以比较日期,但我只想比较日期和月份。例如,如果一个联系人出生于 1960 年 5 月 1 日(假设今天是 2011 年 4 月 24 日),那么我只想计算距离他们的生日只有六天。帮助表示赞赏。

4

3 回答 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;

现在你有天数......

编辑:

您还可以使用NSCalendarandNSDateComponents 仅获取两个日期之间的日期部分。

- (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

检索到联系人的生日后:

ABAddressBook 获取生日属性

您需要调整年份组件:

NSDate - 更改年份值

然后,您可以计算距离她生日的天数:

NSDate 倒计时天数

于 2011-04-24T17:55:36.047 回答