// // LYSDatePickerManager.m // LYSDatePickerController // // Created by HENAN on 2018/5/3. // Copyright © 2018年 liyangshuai. All rights reserved. // #import "LYSDatePickerManager.h" @interface LYSDatePickerManager () @property (nonatomic,strong)NSCalendar *gregorian; // 获取年列表 @property (nonatomic,assign)int year_from; @property (nonatomic,assign)int year_to; @property (nonatomic,strong)NSArray *years; // 获取月列表 @property (nonatomic,assign)int month_year; @property (nonatomic,strong)NSArray *months; // 获取天列表(不包含星期几) @property (nonatomic,assign)int day_year; @property (nonatomic,assign)int day_month; @property (nonatomic,strong)NSArray *days; // 获取天列表(包含星期几) @property (nonatomic,assign)int weekday_year; @property (nonatomic,assign)int weekday_month; @property (nonatomic,strong)NSArray *weekdays; // 获取小时 @property (nonatomic,strong)NSArray *hours; // 获取分钟 @property (nonatomic,strong)NSArray *minutes; @end @implementation LYSDatePickerManager #pragma mark - 计算日期 - - (NSCalendar *)gregorian { if (!_gregorian) { _gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; } return _gregorian; } // 获取年列表 - (NSArray *)fetchYearsWithFromYear:(int)fromYear to:(int)toYear { BOOL isCan = _year_from == fromYear && _year_to == toYear && _years && [_years count] > 0; if (!isCan) { NSMutableArray *tempAry = [NSMutableArray array]; for (int i = fromYear; i <= toYear; i++) { [tempAry addObject:[NSString stringWithFormat:@"%d",i]]; } _years = tempAry;_year_from = fromYear;_year_to = toYear; } return _years; } // 获取月列表 - (NSArray *)fetchMonthsWithYear:(int)year { BOOL isCan = _month_year == year && _months && [_months count] > 0; if (!isCan) { NSDate *tempDate = [self dateWithString:[NSString stringWithFormat:@"%@",@(year)] formatter:@"yyyy"]; NSInteger length = [self.gregorian rangeOfUnit:NSCalendarUnitMonth inUnit:NSCalendarUnitYear forDate:tempDate].length; NSMutableArray *tempAry = [NSMutableArray array]; for (int i = 1; i <= length; i++) { [tempAry addObject:[NSString stringWithFormat:@"%d",i]]; } _months = tempAry;_month_year= year; } return _months; } // 获取日列表(不包含星期几) - (NSArray *)fetchDaysWithYear:(int)year month:(int)month { BOOL isCan = _day_year == year && _day_month == month && _days && [_days count] > 0; if (!isCan) { NSDate *tempDate = [self dateWithString:[NSString stringWithFormat:@"%@/%@",@(year),@(month)] formatter:@"yyyy/MM"]; NSInteger length = [self.gregorian rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:tempDate].length; NSMutableArray *tempAry = [NSMutableArray array]; for (int i = 1; i <= length; i++) { [tempAry addObject:[NSString stringWithFormat:@"%d",i]]; } _days = tempAry;_day_month = month;_day_year = year; } return _days; } // 获取日列表(包含星期几) - (NSArray *)fetchDaysAndWeekDayWithYear:(int)year month:(int)month isShortWeekName:(BOOL)isShortName identifier:(NSString *)identifier { BOOL isCan = _weekday_year == year && _weekday_month == month && _weekdays && [_weekdays count] > 0; if (!isCan) { NSDate *tempDate = [self dateWithString:[NSString stringWithFormat:@"%@/%@",@(year),@(month)] formatter:@"yyyy/MM"]; NSInteger length = [self.gregorian rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:tempDate].length; unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; NSDateComponents *comps = [self.gregorian components:unitFlags fromDate:tempDate]; [comps setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; NSMutableArray *tempAry = [NSMutableArray array]; for (int i = 1; i <= length; i++) { [comps setDay:i]; NSString *str = @""; if ([identifier isEqualToString:@"zh_CN"]) { str = [self fetchWeekdayCNNameWithDate:[self.gregorian dateFromComponents:comps] isShortName:isShortName]; } if ([identifier isEqualToString:@"en_US"]) { str = [self fetchWeekdayENNameWithDate:[self.gregorian dateFromComponents:comps] isShortName:isShortName]; } [tempAry addObject:str]; } _weekdays = tempAry;_weekday_month = month;_weekday_year = year; } return _weekdays; } // 获取小时 - (NSArray *)fetchHour { BOOL isCan = _hours && [_hours count] > 0; if (!isCan) { NSMutableArray *tempAry = [NSMutableArray array]; for (int i = 0; i <= 23; i++) { NSString *str = [NSString stringWithFormat:@"%d",i]; if (i < 10) { str = [NSString stringWithFormat:@"0%@",str]; } [tempAry addObject:str]; } _hours = tempAry; } return _hours; } // 获取分钟 - (NSArray *)fetchMinutes { BOOL isCan = _minutes && [_minutes count] > 0; if (!isCan) { NSMutableArray *tempAry = [NSMutableArray array]; for (int i = 0; i <= 59; i++) { NSString *str = [NSString stringWithFormat:@"%d",i]; if (i < 10) { str = [NSString stringWithFormat:@"0%@",str]; } [tempAry addObject:str]; } _minutes = tempAry; } return _minutes; } - (NSDate *)dateWithString:(NSString *)dateStr formatter:(NSString *)formatStr { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = formatStr; return [formatter dateFromString:dateStr]; } // 获取给定日期所在的月有多少天 - (NSUInteger)fetchDaysOfMonthWithDate:(NSDate *)date { NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSRange range = [gregorian rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date]; return range.length; } // 获取给定日期所在的年有多少天 - (NSUInteger)fecthDaysOfYearWithDate:(NSDate *)date { NSUInteger days = 0; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDateComponents *comps = [gregorian components:NSCalendarUnitYear fromDate:date]; for (NSUInteger i=1; i<=12; i++) { [comps setMonth:i]; days += [self fetchDaysOfMonthWithDate:[gregorian dateFromComponents:comps]]; } return days; } // 获取给定日期所在月第一天的日期 - (NSDate *)fetchFirstDayOfMonthWithDate:(NSDate *)date { NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; NSDateComponents *comps = [gregorian components:unitFlags fromDate:date]; [comps setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; // 使用UTC或GMT解决时区相差8小时的问题 [comps setDay:1]; return [gregorian dateFromComponents:comps]; } // 获取给定日期所在月最后一天的日期 - (NSDate *)fetchLastDayOfMonthWithDate:(NSDate *)date { NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; NSDateComponents *comps = [gregorian components:unitFlags fromDate:date]; [comps setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; // 使用UTC或GMT解决时区相差8小时的问题 [comps setDay:[self fetchDaysOfMonthWithDate:date]]; return [gregorian dateFromComponents:comps]; } // 获取给定日期是星期几 - (NSInteger)fetchWeekdayNumWithDate:(NSDate *)date { return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:date] weekday]; } // 获取给定日期是星期几 - (NSString *)fetchWeekdayNameWithDate:(NSDate *)date isShortName:(BOOL)isShortName localeIdentifier:(NSString *)localeIdentifier { NSDateFormatter *formatter = [NSDateFormatter new]; formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier]; formatter.dateFormat = isShortName ? @"EE" : @"EEEE"; return [formatter stringFromDate:date]; } // 获取给定日期是星期几 - (NSString *)fetchWeekdayCNNameWithDate:(NSDate *)date isShortName:(BOOL)isShortName { return [self fetchWeekdayNameWithDate:date isShortName:isShortName localeIdentifier:@"zh_CN"]; } // 获取给定日期是星期几 - (NSString *)fetchWeekdayENNameWithDate:(NSDate *)date isShortName:(BOOL)isShortName { return [self fetchWeekdayNameWithDate:date isShortName:isShortName localeIdentifier:@"en_US"]; } @end