我正在計算我的地址簿中的任何聯繫人是否在未來10天內有生日。有很多代碼可以比較日期,但我只想比較日期和月份。例如,如果一個聯繫人在05/01/1960出生(假設今天是2011年4月24日),那麼我只想計算一下,直到他們的生日只有六天。幫助讚賞。我的聯繫人在未來10天內的生日
回答
將生日更改爲今年(或明年如果生日已在今年),並使用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]);
太棒了!感謝fluchtpunkt。這工作完美。誰會想到這麼簡單就需要這麼多的工作。 – Jeremy 2011-04-24 18:39:24
與日期相關的一切都需要大量的代碼,如果你想做正確的話。這就是爲什麼有很多時區,夏令時,閏年等錯誤。 (是的,我看你86400用戶。)我們可以感到高興,我們有NSDateComponents和NSCalendar,否則你可能需要20倍的代碼。 – 2011-04-24 18:47:14
哦,順便說一句,即使你認爲你對未來幾年的生日不感興趣,也不要刪除'if([difference day] <0)'部分。其實你對一年中前10天的生日至少有一年的最後10天感興趣。花了我一段時間來弄清楚這一點。 – 2011-04-24 18:50:05
一旦檢索聯繫人的生日:
ABAddressBook get birthday property
你需要調整年份組成:
NSDate - Changing the year value
然後,你可以計算天數,直到她的生日:
您的聯繫NSDate
使用下面的NSDate功能。
- (NSTimeInterval)timeIntervalSinceNow
上述函數返回在接收器和當前日期和時間之間的間隔。
NSTimeInterval interval = [date1 timeIntervalSinceNow:myContactDate];
NSTimeInterval
是以秒計的經過時間(表示爲浮點數)。然後你可以除以86400,這是一天中的秒數和四捨五入到最接近的整數。
NSInteger days = interval/86400;
現在你有天數...
編輯:
您也可以使用NSCalendar
和NSDateComponents
只得到兩個日期之間的天組件。
- (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];
- 1. 今天有生日的聯繫人
- 2. oracle找到未來65天生日爲30天的人
- 3. Windows 10聯繫人
- 4. 如何檢索聯繫人的生日?
- 5. 檢索特定聯繫人的生日
- 6. Django的:總的生日每一天接下來的30天內
- 7. 在Android模擬器的聯繫人中的生日字段
- 8. 將android聯繫人的生日複製到日曆中
- 9. 日期格式:Android的聯繫人生日
- 10. 計算未來N天即將到來的生日的方法
- 11. 如何讓我的聯繫人保持在我的分區內?
- 12. 來自聯繫人列表的Android聯繫人號碼
- 13. 篩選出來自聯繫人選取器的Facebook聯繫人
- 14. WebDAV和Exchange Server - 在最近X天內修改聯繫人?
- 15. 聯繫Gem在生產環境中未導入雅虎聯繫人
- 16. 如何從地址簿中的聯繫人10-10
- 17. 添加聯繫人Windows 10通用
- 18. 我想填充地址在Android聯繫人新的或現有的聯繫人
- 19. 如何更改Google GMail聯繫人的生日?
- 20. 如何從UWP中的聯繫人中獲取生日?
- 21. 如何閱讀Android中聯繫人的生日?
- 22. 對未知聯繫人的QuickContactBadge
- 23. UITableView中未加載的聯繫人
- 24. 將Office 365聯繫人同步到我的系統上的聯繫人
- 25. 聊天聯繫人列表VB.NET和MSSQL
- 26. 從呼叫日誌獲取DISTINCT最近聯繫的聯繫人
- 27. 如何在我的活動內顯示本機聯繫人android
- 28. Android的SDK-獲得來自聯繫人列表中特定聯繫人的
- 29. 我在電話聯繫人列表中的應用程序聯繫人
- 30. 在接下來的X天中有生日的人的查詢集
在SO上做你的CS作業會留下很長的紙痕跡......祝你好運。 – coneybeare 2011-04-24 18:44:58