关于 iOS 日历、时间日期

在开发过程中, 会经常碰到时间日期的计算, 今天闲暇之余将笔记中关于日历、时间和日期的记录分享一下(虽然网上有很多)...

1. 获取当前月份

//
#pragma mark 获取当前月份
+ (NSString *)currentMouth {
    
    //获取当前时间日期
    NSDate *currentDate = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"YYYY-MM"];
    NSString *dateString = [dateFormatter stringFromDate:currentDate];
    
    return dateString;
}

2. 获取当前月份的天数

#pragma mark 获取当前月份的天数
+ (NSInteger)numberOfDaysInCurrentMonth {
    // 初始化日历
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    // 获取系统当前日期
    NSDate *currentDate = [NSDate date];
    // 获取当前日期中当前月中天的范围
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:currentDate];
    // 得到当前月中总共有多少天(即范围的长度)
    NSInteger numberOfDaysInCurrentMonth = range.length;
    return numberOfDaysInCurrentMonth;
}

3. 获取当前月中共有多少周

#pragma mark 获取当前月中共有多少周
+ (NSInteger)numberOfWeeksInCurrentMonth {
    // 初始化日历
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    // 获取系统当前日期
    NSDate *currentDate = [NSDate date];
    // 获取当前日期中当前月中周的范围
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitWeekOfMonth inUnit:NSCalendarUnitMonth forDate:currentDate];
    // 得到当前月中总共有多少周(即范围的长度)
    NSInteger numberOfWeeksInCurrentMonth = range.length;
    return numberOfWeeksInCurrentMonth;
}

5. 获取 上个月的天数

#pragma mark 获取 上个月的天数
+ (NSInteger)getBeforeNumberOfDaysInMonth {
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *currentDate = [NSDate date];
    NSDateComponents *lastMonthComps = [[NSDateComponents alloc] init];
    //    [lastMonthComps setYear:1]; // year = 1表示1年后的时间 year = -1为1年前的日期,month day 类推
    [lastMonthComps setMonth:-1];
    NSDate *newdate = [calendar dateByAddingComponents:lastMonthComps toDate:currentDate options:0];
    
    // 只要个时间给日历,就会帮你计算出来。这里的时间取当前的时间。
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay
                                    inUnit: NSCalendarUnitMonth
                                   forDate:newdate];
    //NSLog(@"当月天数 = %lu",(unsigned long)range.length);
    return range.length;
}

6. 获取下个月份

#pragma mark 获取下个月份
+ (NSString *)nextMonth {
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *currentDate = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"YYYY-MM"];
    
    NSDateComponents *lastMonthComps = [[NSDateComponents alloc] init];
    //    [lastMonthComps setYear:1]; // year = 1表示1年后的时间 year = -1为1年前的日期,month day 类推
    [lastMonthComps setMonth:1];
    NSDate *newdate = [calendar dateByAddingComponents:lastMonthComps toDate:currentDate options:0];
    NSString *dateStr = [dateFormatter stringFromDate:newdate];
    //NSLog(@"date str = %@",dateStr);
    
    return dateStr;
}

7. 获取 下个月的天数

#pragma mark 获取 下个月的天数
+ (NSInteger)getNextNumberOfDaysInMonth {
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *currentDate = [NSDate date];
    NSDateComponents *lastMonthComps = [[NSDateComponents alloc] init];
    //    [lastMonthComps setYear:1]; // year = 1表示1年后的时间 year = -1为1年前的日期,month day 类推
    [lastMonthComps setMonth:1];
    NSDate *newdate = [calendar dateByAddingComponents:lastMonthComps toDate:currentDate options:0];
    
    // 只要个时间给日历,就会帮你计算出来。这里的时间取当前的时间。
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay
                                   inUnit: NSCalendarUnitMonth
                                  forDate:newdate];
    //NSLog(@"当月天数 = %lu",(unsigned long)range.length);
    return range.length;
}

8. 获取当前月中第一天在一周内的索引

#pragma mark 获取当前月中第一天在一周内的索引
+ (NSInteger)indexOfWeekForFirstDayInCurrentMonth {
    // 初始化日历
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    // 获取系统当前日期
    NSDate *currentDate = [NSDate date];
    
    // 获取当前月中的第一天的日期
    NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday fromDate:currentDate];
    [dateComponents setDay:1];
    NSDate *beginDate = [[NSCalendar currentCalendar] dateFromComponents:dateComponents];
    
    NSDateComponents *beginDateComponents = [calendar components:NSCalendarUnitWeekday fromDate:beginDate];// 当前月中的第一天的日期组件
    
    NSInteger indexOfWeek = ([beginDateComponents weekday] + 6) % 7;// 将格式:日一, ……,五, 六  转换成格式:一二, ……, 六 日,获得索引
    
    return indexOfWeek;
}

9. 获取当天在当月中的索引(第几天)

#pragma mark 获取当天在当月中的索引(第几天)
+ (NSInteger)indexOfMonthForTodayInCurrentMonth {
    // 初始化日历
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    // 获取系统当前日期
    NSDate *currentDate = [NSDate date];
    // 获取当前日期的组件
    NSDateComponents *dateComponents = [calendar components:NSCalendarUnitDay fromDate:currentDate];
    NSInteger indexOfMonthForTodayInCurrentMonth = [dateComponents day];
    return indexOfMonthForTodayInCurrentMonth;
}

最后
NSCalendar 是一个功能虽然强大,但同时多次初始化可能会造成性能较低,如果在程序从多次使用,可以定义为全局变量,尽量避免过多的初始化

如果这篇文章对您有些许帮助 请给我点个心哦。

你可能感兴趣的:(关于 iOS 日历、时间日期)