發現即將到來的生日,我試圖找到在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
。我在上面的代碼片段中做了什麼?我想我可能會做的工作太多的東西,看似如此簡單,你會如何解決這個問題的安排,讓我不必切片today
和birthday
成組件,並把它們放回一個NSDate
?
你見過[「當日期落入檢查」(http://developer.apple.com/library/mac/documentation/Cocoa/概念/ DatesAndTimes /用品/ dtCalendricalCalculations.html#// apple_ref/DOC/UID/TP40007836-SW9)中的日期和時間編程指南?對於第二點,你也可以得到時間的差異;如果日差爲0但小時爲正值,那應該表示它是第二天。 – 2013-02-28 19:21:53
從01/01開始,將生日放在有序列表中。在列表中查找當前日期並向前掃描,直到遇到列表的結尾或超過一週的日期。如果您遇到列表的末尾,並且當前日期在年末的一週內,請掃描列表的前面以填寫該周。 – 2013-02-28 19:28:35
您可以將birthdayComponents.year設置爲每個「下一個」生日結果的「正確」年份。換句話說,如果生日月<當前月份,那麼生日年份是當前年份+ 1(但是請記住,如果月份相同,但我們已經過了他們的生日)。 – Fraggle 2013-02-28 19:40:19