#pragma mark - Calendar helpers
返回date所在月的第一天的日期,比如说date = 10月17日,那么返回的就是10月1日
- (NSDate *)firstDayOfMonthContainingDate:(NSDate *)date
{
NSDateComponents *comps = [self.calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];
[comps setDay:1];
return [self.calendar dateFromComponents:comps];
}
通过设置firstday,然后返回星期数组(周日,周一,周二,。。。,周六)
enum {
startSunday = 1,//1表示星期的第一天是周日
startMonday = 2,//2表示星期的第一天是周一
};
typedef int startDay;- (NSArray *)getDaysOfTheWeek
{ NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// adjust array depending on which weekday should be first
NSArray *weekdays = [dateFormatter shortWeekdaySymbols];
NSUInteger firstWeekdayIndex = [self.calendar firstWeekday] -1;
if (firstWeekdayIndex > 0)
{
weekdays = [[weekdays subarrayWithRange:NSMakeRange(firstWeekdayIndex,7-firstWeekdayIndex)]arrayByAddingObjectsFromArray:[weekdays subarrayWithRange:NSMakeRange(0,firstWeekdayIndex)]];
}
return weekdays;
}
返回date表示的日期是所在周的第几天
- (int)dayOfWeekForDate:(NSDate *)date {
NSDateComponents *comps = [self.calendar components:NSWeekdayCalendarUnit fromDate:date];
return comps.weekday;
}
判断date是否是今天
- (BOOL)dateIsToday:(NSDate *)date {
NSDateComponents *otherDay = [self.calendar components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date]; NSDateComponents *today = [self.calendar components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
return ([today day] == [otherDay day] && [today month] == [otherDay month] && [today year] == [otherDay year] && [today era] == [otherDay era]);
}返回date所在月的第几周
- (int)weekNumberInMonthForDate:(NSDate *)date {
NSDateComponents *comps = [self.calendar components:(NSWeekOfMonthCalendarUnit) fromDate:date];
return comps.weekOfMonth;
}
返回date所在月共几周
- (int)numberOfWeeksInMonthContainingDate:(NSDate *)date {
return [self.calendar rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:date].length;
}
判断date和self.monthShowing是在同一个月
- (BOOL)dateIsInMonthShowing:(NSDate *)date {
NSDateComponents *comps1 = [self.calendar components:(NSMonthCalendarUnit) fromDate:self.monthShowing]; NSDateComponents *comps2 = [self.calendar components:(NSMonthCalendarUnit) fromDate:date];
return comps1.month == comps2.month;
}
返回date当前月的下一天,如果月份不同,则要进行判断,适当增加月数和年数
- (NSDate *)nextDay:(NSDate *)date {
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:1];
return [self.calendar dateByAddingComponents:comps toDate:date options:0];
}
判断两个日期的先后顺序
- (NSComparisonResult)date:(NSDate *)firstdate compare:(NSDate*)secondate
{
NSLog(@"first = %@",firstdate);
NSLog(@"second = %@",secondate);
NSDateComponents *components = [self.calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate: firstdate];
NSInteger firstYear = components.year;
NSInteger firstMonth = components.month;
NSInteger firstDay = components.day;
NSDateComponents * calcomponents = [self.calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate: secondate];
NSInteger secondYear = calcomponents.year;
NSInteger secondMonth = calcomponents.month;
NSInteger secondDay = calcomponents.day;
NSComparisonResult result = NSOrderedSame;
if(firstYear < secondYear) {
result = NSOrderedAscending;
}
else if(firstYear == secondYear) {
if(firstMonth < secondMonth) {
result = NSOrderedAscending;
}
else if(firstMonth == secondMonth) {
if(firstDay < secondDay) {
result = NSOrderedAscending;
}
else if(firstDay == secondDay) {
result = NSOrderedSame;
}
else {
result = NSOrderedDescending;
}
}
else {
result = NSOrderedDescending;
}
}
else {
result = NSOrderedDescending;
}
return result;
}