在寫一個記賬軟件,其中有個統計功能。比如,統計某月的支出,需要知道某天所在的月的第一天和最后一天,以便從數據庫中根據時間取數據。
話不多說,上代碼:
// // EBDate.h // ChargeMoney // // Created by eagle on 15-3-24. // Copyright (c) 2015年 EagleB. All rights reserved. // #import <Foundation/Foundation.h> @interface EBDate : NSObject /** * 得到這個周的第一天和最后一天 */ +(NSArray *)getFirstAndLastDayOfThisWeek; /** * 得到這個月的第一天和最后一天 */ +(NSArray *)getFirstAndLastDayOfThisMonth; /** * 得到今年的第一天和最后一天 */ +(NSArray *)getFirstAndLastDayOfThisYear; @end
// // EBDate.m // ChargeMoney // // Created by eagle on 15-3-24. // Copyright (c) 2015年 EagleB. All rights reserved. // #import "EBDate.h" @implementation EBDate +(NSArray *)getFirstAndLastDayOfThisWeek { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *dateComponents = [calendar components:NSWeekdayCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; NSInteger weekday = [dateComponents weekday]; //第幾天(從sunday開始) NSInteger firstDiff,lastDiff; if (weekday == 1) { firstDiff = -6; lastDiff = 0; }else { firstDiff = - weekday + 2; lastDiff = 8 - weekday; } NSInteger day = [dateComponents day]; NSDateComponents *firstComponents = [calendar components:NSWeekdayCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; [firstComponents setDay:day+firstDiff]; NSDate *firstDay = [calendar dateFromComponents:firstComponents]; NSDateComponents *lastComponents = [calendar components:NSWeekdayCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; [lastComponents setDay:day+lastDiff]; NSDate *lastDay = [calendar dateFromComponents:lastComponents]; return [NSArray arrayWithObjects:firstDay,lastDay, nil]; } +(NSArray *)getFirstAndLastDayOfThisMonth { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *firstDay; [calendar rangeOfUnit:NSMonthCalendarUnit startDate:&firstDay interval:nil forDate:[NSDate date]]; NSDateComponents *lastDateComponents = [calendar components:NSMonthCalendarUnit | NSYearCalendarUnit |NSDayCalendarUnit fromDate:firstDay]; NSUInteger dayNumberOfMonth = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length; NSInteger day = [lastDateComponents day]; [lastDateComponents setDay:day+dayNumberOfMonth-1]; NSDate *lastDay = [calendar dateFromComponents:lastDateComponents]; return [NSArray arrayWithObjects:firstDay,lastDay, nil]; } +(NSArray *)getFirstAndLastDayOfThisYear { //通過2月天數的改變,來確定全年天數 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setTimeZone:[NSTimeZone systemTimeZone]]; [formatter setDateFormat:@"yyyy"]; NSString *dateStr = [formatter stringFromDate:[NSDate date]]; dateStr = [dateStr stringByAppendingString:@"-02-14"]; [formatter setDateFormat:@"yyyy-MM-dd"]; NSDate *aDayOfFebruary = [formatter dateFromString:dateStr]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *firstDay; [calendar rangeOfUnit:NSYearCalendarUnit startDate:&firstDay interval:nil forDate:[NSDate date]]; NSDateComponents *lastDateComponents = [calendar components:NSMonthCalendarUnit | NSYearCalendarUnit | NSDayCalendarUnit fromDate:firstDay]; NSUInteger dayNumberOfFebruary = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:aDayOfFebruary].length; NSInteger day = [lastDateComponents day]; [lastDateComponents setDay:day+337+dayNumberOfFebruary-1]; NSDate *lastDay = [calendar dateFromComponents:lastDateComponents]; return [NSArray arrayWithObjects:firstDay,lastDay, nil]; } @end
注意頻繁創建Canlendar,會嚴重消耗系統性能,該文章的方法僅提供一個參考。
感謝這篇文章:http://my.oschina.net/yongbin45/blog/156181#OSC_h4_7
--------------------------------------
更新:
上邊的方法有點笨了,貼上最新的代碼。可能過段時間看,這方法又笨了。不得不說,底層的API提供的功能越來強大,你要寫的越來越簡單。

1 /** 2 * month: range from 1 to 12 3 **/ 4 + (NSArray<NSDate *> *)getFirstAndLastDayOfMonth:(NSInteger)month inYear:(NSInteger)year { 5 NSCalendar *calendar = [NSCalendar currentCalendar]; 6 NSDate *date = [self getDateWithMonth:month year:year]; 7 NSDate *firstDay; 8 NSTimeInterval interval; 9 [calendar rangeOfUnit:NSCalendarUnitMonth startDate:&firstDay interval:&interval forDate:date]; 10 NSDateComponents *lastDateComponents = [calendar components:NSCalendarUnitMonth | NSCalendarUnitYear |NSCalendarUnitDay fromDate:firstDay]; 11 NSUInteger dayNumberOfMonth = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date].length; 12 NSInteger day = [lastDateComponents day]; 13 [lastDateComponents setDay:day + dayNumberOfMonth]; 14 lastDateComponents.nanosecond = lastDateComponents.nanosecond - 1000000; 15 NSDate *lastDay = [calendar dateFromComponents:lastDateComponents]; 16 return [NSArray arrayWithObjects:firstDay,lastDay, nil]; 17 } 18 19 + (NSArray<NSDate *> *)getFirstAndLastDayOfYear:(NSInteger)year { 20 NSDate *date = [self getDateWithYear:year]; 21 NSCalendar *calendar = [NSCalendar currentCalendar]; 22 NSDate *firstDay; 23 [calendar rangeOfUnit:NSCalendarUnitYear startDate:&firstDay interval:nil forDate:date]; 24 NSDateComponents *lastDateComponents = [calendar components:NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitDay fromDate:firstDay]; 25 NSUInteger dayNumberOfYear = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:date].length; 26 NSInteger day = [lastDateComponents day]; 27 [lastDateComponents setDay:day + dayNumberOfYear]; 28 lastDateComponents.nanosecond = lastDateComponents.nanosecond - 1000000; 29 NSDate *lastDay = [calendar dateFromComponents:lastDateComponents]; 30 return [NSArray arrayWithObjects:firstDay,lastDay, nil]; 31 } 32 33 + (NSDate *)getDateWithMonth:(NSInteger)month year:(NSInteger)year { 34 NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 35 dateComponents.year = year; 36 dateComponents.month = month; 37 38 NSCalendar *calendar = [NSCalendar currentCalendar]; 39 NSDate *date = [calendar dateFromComponents:dateComponents]; 40 return date; 41 } 42 43 + (NSDate *)getDateWithYear:(NSInteger)year { 44 NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 45 dateComponents.year = year; 46 47 NSCalendar *calendar = [NSCalendar currentCalendar]; 48 NSDate *date = [calendar dateFromComponents:dateComponents]; 49 return date; 50 }