2011-04-24 39 views
1

我正在計算我的地址簿中的任何聯繫人是否在未來10天內有生日。有很多代碼可以比較日期,但我只想比較日期和月份。例如,如果一個聯繫人在05/01/1960出生(假設今天是2011年4月24日),那麼我只想計算一下,直到他們的生日只有六天。幫助讚賞。我的聯繫人在未來10天內的生日

+0

在SO上做你的CS作業會留下很長的紙痕跡......祝你好運。 – coneybeare 2011-04-24 18:44:58

回答

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]); 
+0

太棒了!感謝fluchtpunkt。這工作完美。誰會想到這麼簡單就需要這麼多的工作。 – Jeremy 2011-04-24 18:39:24

+0

與日期相關的一切都需要大量的代碼,如果你想做正確的話。這就是爲什麼有很多時區,夏令時,閏年等錯誤。 (是的,我看你86400用戶。)我們可以感到高興,我們有NSDateComponents和NSCalendar,否則你可能需要20倍的代碼。 – 2011-04-24 18:47:14

+0

哦,順便說一句,即使你認爲你對未來幾年的生日不感興趣,也不要刪除'if([difference day] <0)'部分。其實你對一年中前10天的生日至少有一年的最後10天感興趣。花了我一段時間來弄清楚這一點。 – 2011-04-24 18:50:05

0

您的聯繫NSDate使用下面的NSDate功能。

- (NSTimeInterval)timeIntervalSinceNow 

上述函數返回在接收器和當前日期和時間之間的間隔。

NSTimeInterval interval = [date1 timeIntervalSinceNow:myContactDate]; 

NSTimeInterval是以秒計的經過時間(表示爲浮點數)。然後你可以除以86400,這是一天中的秒數和四捨五入到最接近的整數。

NSInteger days = interval/86400; 

現在你有天數...

編輯:

您也可以使用NSCalendarNSDateComponents只得到兩個日期之間的天組件。

- (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts 

使用下面的代碼作爲參考。 (Taken From Apple Documentation for NSCalendar

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]; 
相關問題