2013-02-28 57 views
1

發現即將到來的生日,我試圖找到在iOS上一個星期即將到來的生日。我從Facebook拉生日數據和修剪年份部分(因爲它可能不適用於根據用戶的隱私設置一些用戶),因此生日的數據是NSString與日期格式@"MM/dd"IOS - 在一個星期

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 - 我有一個bug在此代碼,如果有不到一個星期到新的一年,我不會能夠在新的一年中顯示的生日,因爲我生日的年份設置爲當前年份,difference.day將是在新的一年生日的方式小於0。我該如何解決這個問題?

2 - 你可以從上面的代碼中,我做了很多舞蹈的看到:第一,我得到今天的日期和時間與[NSDate date],然後我把它撕開而其組件,並用時間組裝回一個NSDate中午而不是當前時間。我這樣做的原因是,如果[NSDate date]返回,其時間的日期是說23:00:00,如果生日時間爲00:00:00(1個小時後,這意味着明天生日),然後difference.day等號0而不是所需的1。我在上面的代碼片段中做了什麼?我想我可能會做的工作太多的東西,看似如此簡單,你會如何解決這個問題的安排,讓我不必切片todaybirthday成組件,並把它們放回一個NSDate

+1

你見過[「當日期落入檢查」(http://developer.apple.com/library/mac/documentation/Cocoa/概念/ DatesAndTimes /用品/ dtCalendricalCalculations.html#// apple_ref/DOC/UID/TP40007836-SW9)中的日期和時間編程指南?對於第二點,你也可以得到時間的差異;如果日差爲0但小時爲正值,那應該表示它是第二天。 – 2013-02-28 19:21:53

+0

從01/01開始,將生日放在有序列表中。在列表中查找當前日期並向前掃描,直到遇到列表的結尾或超過一週的日期。如果您遇到列表的末尾,並且當前日期在年末的一週內,請掃描列表的前面以填寫該周。 – 2013-02-28 19:28:35

+0

您可以將birthdayComponents.year設置爲每個「下一個」生日結果的「正確」年份。換句話說,如果生日月<當前月份,那麼生日年份是當前年份+ 1(但是請記住,如果月份相同,但我們已經過了他們的生日)。 – Fraggle 2013-02-28 19:40:19

回答

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