update
This commit is contained in:
111
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView+BR.h
generated
Normal file
111
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView+BR.h
generated
Normal file
@@ -0,0 +1,111 @@
|
||||
//
|
||||
// BRDatePickerView+BR.h
|
||||
// BRPickerViewDemo
|
||||
//
|
||||
// Created by renbo on 2020/6/16.
|
||||
// Copyright © 2020 irenb. All rights reserved.
|
||||
//
|
||||
// 最新代码下载地址:https://github.com/91renb/BRPickerView
|
||||
|
||||
#import "BRDatePickerView.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface BRDatePickerView (BR)
|
||||
|
||||
/** 最小日期 */
|
||||
- (NSDate *)handlerMinDate:(nullable NSDate *)minDate;
|
||||
|
||||
/** 最大日期 */
|
||||
- (NSDate *)handlerMaxDate:(nullable NSDate *)maxDate;
|
||||
|
||||
/** 默认选中的日期 */
|
||||
- (NSDate *)handlerSelectDate:(nullable NSDate *)selectDate dateFormat:(NSString *)dateFormat;
|
||||
|
||||
/** NSDate 转 NSString */
|
||||
- (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat;
|
||||
|
||||
/** NSString 转 NSDate */
|
||||
- (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat;
|
||||
|
||||
/** 比较两个日期大小(可以指定比较级数,即按指定格式进行比较) */
|
||||
- (NSComparisonResult)br_compareDate:(NSDate *)date targetDate:(NSDate *)targetDate dateFormat:(NSString *)dateFormat;
|
||||
|
||||
/** 获取 yearArr 数组 */
|
||||
- (NSArray *)getYearArr;
|
||||
|
||||
/** 获取 monthArr 数组 */
|
||||
- (NSArray *)getMonthArr:(NSInteger)year;
|
||||
|
||||
/** 获取 dayArr 数组 */
|
||||
- (NSArray *)getDayArr:(NSInteger)year month:(NSInteger)month;
|
||||
|
||||
/** 获取 hourArr 数组 */
|
||||
- (NSArray *)getHourArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day;
|
||||
|
||||
/** 获取 minuteArr 数组 */
|
||||
- (NSArray *)getMinuteArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour;
|
||||
|
||||
/** 获取 secondArr 数组 */
|
||||
- (NSArray *)getSecondArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute;
|
||||
|
||||
/** 获取 monthWeekArr 数组 */
|
||||
- (NSArray *)getMonthWeekArr:(NSInteger)year month:(NSInteger)month;
|
||||
|
||||
/** 获取 yearWeekArr 数组 */
|
||||
- (NSArray *)getYearWeekArr:(NSInteger)year;
|
||||
|
||||
/** 获取 quarterArr 数组 */
|
||||
- (NSArray *)getQuarterArr:(NSInteger)year;
|
||||
|
||||
/** 添加 pickerView */
|
||||
- (void)setupPickerView:(UIView *)pickerView toView:(UIView *)view;
|
||||
|
||||
/** 设置日期单位 */
|
||||
- (NSArray *)setupPickerUnitLabel:(UIPickerView *)pickerView unitArr:(NSArray *)unitArr;
|
||||
|
||||
- (NSString *)getYearNumber:(NSInteger)year;
|
||||
|
||||
- (NSString *)getMDHMSNumber:(NSInteger)number;
|
||||
|
||||
- (NSString *)getYearText:(NSArray *)yearArr row:(NSInteger)row;
|
||||
|
||||
- (NSString *)getMonthText:(NSArray *)monthArr row:(NSInteger)row;
|
||||
|
||||
- (NSString *)getDayText:(NSArray *)dayArr row:(NSInteger)row mSelectDate:(NSDate *)mSelectDate;
|
||||
|
||||
- (NSString *)getHourText:(NSArray *)hourArr row:(NSInteger)row;
|
||||
|
||||
- (NSString *)getMinuteText:(NSArray *)minuteArr row:(NSInteger)row;
|
||||
|
||||
- (NSString *)getSecondText:(NSArray *)secondArr row:(NSInteger)row;
|
||||
|
||||
- (NSString *)getWeekText:(NSArray *)weekArr row:(NSInteger)row;
|
||||
|
||||
- (NSString *)getQuarterText:(NSArray *)quarterArr row:(NSInteger)row;
|
||||
|
||||
- (NSString *)getAMText;
|
||||
|
||||
- (NSString *)getPMText;
|
||||
|
||||
- (NSString *)getYearUnit;
|
||||
|
||||
- (NSString *)getMonthUnit;
|
||||
|
||||
- (NSString *)getDayUnit;
|
||||
|
||||
- (NSString *)getHourUnit;
|
||||
|
||||
- (NSString *)getMinuteUnit;
|
||||
|
||||
- (NSString *)getSecondUnit;
|
||||
|
||||
- (NSString *)getWeekUnit;
|
||||
|
||||
- (NSString *)getQuarterUnit;
|
||||
|
||||
- (NSInteger)getIndexWithArray:(NSArray *)array object:(NSString *)obj;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
755
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView+BR.m
generated
Normal file
755
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView+BR.m
generated
Normal file
@@ -0,0 +1,755 @@
|
||||
//
|
||||
// BRDatePickerView+BR.m
|
||||
// BRPickerViewDemo
|
||||
//
|
||||
// Created by renbo on 2020/6/16.
|
||||
// Copyright © 2020 irenb. All rights reserved.
|
||||
//
|
||||
// 最新代码下载地址:https://github.com/91renb/BRPickerView
|
||||
|
||||
#import "BRDatePickerView+BR.h"
|
||||
#import "NSBundle+BRPickerView.h"
|
||||
|
||||
BRSYNTH_DUMMY_CLASS(BRDatePickerView_BR)
|
||||
|
||||
//////////////////////////////////////////
|
||||
/// 本分类主要是给 BRDatePickerView 文件瘦身
|
||||
//////////////////////////////////////////
|
||||
|
||||
@implementation BRDatePickerView (BR)
|
||||
|
||||
#pragma mark - 最小日期
|
||||
- (NSDate *)handlerMinDate:(NSDate *)minDate {
|
||||
if (!minDate) {
|
||||
if (self.pickerMode == BRDatePickerModeMDHM) {
|
||||
minDate = [NSDate br_setMonth:1 day:1 hour:0 minute:0];
|
||||
} else if (self.pickerMode == BRDatePickerModeMD) {
|
||||
minDate = [NSDate br_setMonth:1 day:1];
|
||||
} else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
|
||||
minDate = [NSDate br_setHour:0 minute:0];
|
||||
} else if (self.pickerMode == BRDatePickerModeHMS) {
|
||||
minDate = [NSDate br_setHour:0 minute:0 second:0];
|
||||
} else if (self.pickerMode == BRDatePickerModeMS) {
|
||||
minDate = [NSDate br_setMinute:0 second:0];
|
||||
} else {
|
||||
minDate = [NSDate distantPast]; // 遥远的过去的一个时间点
|
||||
}
|
||||
}
|
||||
return minDate;
|
||||
}
|
||||
|
||||
#pragma mark - 最大日期
|
||||
- (NSDate *)handlerMaxDate:(NSDate *)maxDate {
|
||||
if (!maxDate) {
|
||||
if (self.pickerMode == BRDatePickerModeMDHM) {
|
||||
maxDate = [NSDate br_setMonth:12 day:31 hour:23 minute:59];
|
||||
} else if (self.pickerMode == BRDatePickerModeMD) {
|
||||
maxDate = [NSDate br_setMonth:12 day:31];
|
||||
} else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
|
||||
maxDate = [NSDate br_setHour:23 minute:59];
|
||||
} else if (self.pickerMode == BRDatePickerModeHMS) {
|
||||
maxDate = [NSDate br_setHour:23 minute:59 second:59];
|
||||
} else if (self.pickerMode == BRDatePickerModeMS) {
|
||||
maxDate = [NSDate br_setMinute:59 second:59];
|
||||
} else {
|
||||
maxDate = [NSDate distantFuture]; // 遥远的未来的一个时间点
|
||||
}
|
||||
}
|
||||
return maxDate;
|
||||
}
|
||||
|
||||
#pragma mark - 默认选中的日期
|
||||
- (NSDate *)handlerSelectDate:(NSDate *)selectDate dateFormat:(NSString *)dateFormat {
|
||||
// selectDate 优先级高于 selectValue(推荐使用 selectDate 设置默认选中的日期)
|
||||
if (!selectDate) {
|
||||
if (self.selectValue && self.selectValue.length > 0) {
|
||||
if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
|
||||
NSString *firstString = [[self.selectValue componentsSeparatedByString:@" "] firstObject];
|
||||
NSString *lastString = [[self.selectValue componentsSeparatedByString:@" "] lastObject];
|
||||
if ([lastString isEqualToString:[self getAMText]]) {
|
||||
self.selectValue = [NSString stringWithFormat:@"%@ 00", firstString];
|
||||
}
|
||||
if ([lastString isEqualToString:[self getPMText]]) {
|
||||
self.selectValue = [NSString stringWithFormat:@"%@ 12", firstString];
|
||||
}
|
||||
}
|
||||
|
||||
NSDate *date = nil;
|
||||
if ([self.selectValue isEqualToString:self.lastRowContent]) {
|
||||
date = self.addToNow ? [NSDate date] : nil;
|
||||
} else if ([self.selectValue isEqualToString:self.firstRowContent]) {
|
||||
date = nil;
|
||||
} else {
|
||||
date = [self br_dateFromString:self.selectValue dateFormat:dateFormat];
|
||||
if (!date) {
|
||||
BRErrorLog(@"参数异常!字符串 selectValue 的正确格式是:%@", dateFormat);
|
||||
NSAssert(date, @"参数异常!请检查字符串 selectValue 的格式");
|
||||
date = [NSDate date]; // 默认值参数格式错误时,重置/忽略默认值,防止在 Release 环境下崩溃!
|
||||
}
|
||||
if (self.pickerMode == BRDatePickerModeMDHM) {
|
||||
selectDate = [NSDate br_setMonth:date.br_month day:date.br_day hour:date.br_hour minute:date.br_minute];
|
||||
} else if (self.pickerMode == BRDatePickerModeMD) {
|
||||
selectDate = [NSDate br_setMonth:date.br_month day:date.br_day];
|
||||
} else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
|
||||
selectDate = [NSDate br_setHour:date.br_hour minute:date.br_minute];
|
||||
} else if (self.pickerMode == BRDatePickerModeHMS) {
|
||||
selectDate = [NSDate br_setHour:date.br_hour minute:date.br_minute second:date.br_second];
|
||||
} else if (self.pickerMode == BRDatePickerModeMS) {
|
||||
selectDate = [NSDate br_setMinute:date.br_minute second:date.br_second];
|
||||
} else {
|
||||
selectDate = date;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 不设置默认日期
|
||||
if (self.pickerMode == BRDatePickerModeTime ||
|
||||
self.pickerMode == BRDatePickerModeCountDownTimer ||
|
||||
self.pickerMode == BRDatePickerModeHM ||
|
||||
self.pickerMode == BRDatePickerModeHMS ||
|
||||
self.pickerMode == BRDatePickerModeMS) {
|
||||
// 默认选中最小日期
|
||||
selectDate = self.minDate;
|
||||
} else {
|
||||
if (self.minuteInterval > 1 || self.secondInterval > 1) {
|
||||
NSDate *date = [NSDate date];
|
||||
NSInteger minute = self.minDate.br_minute % self.minuteInterval == 0 ? self.minDate.br_minute : 0;
|
||||
NSInteger second = self.minDate.br_second % self.secondInterval == 0 ? self.minDate.br_second : 0;
|
||||
selectDate = [NSDate br_setYear:date.br_year month:date.br_month day:date.br_day hour:date.br_hour minute:minute second:second];
|
||||
} else {
|
||||
// 默认选中今天的日期
|
||||
selectDate = [NSDate date];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 判断日期是否超过边界限制
|
||||
BOOL selectLessThanMin = [self br_compareDate:selectDate targetDate:self.minDate dateFormat:dateFormat] == NSOrderedAscending;
|
||||
BOOL selectMoreThanMax = [self br_compareDate:selectDate targetDate:self.maxDate dateFormat:dateFormat] == NSOrderedDescending;
|
||||
if (selectLessThanMin) {
|
||||
BRErrorLog(@"默认选择的日期不能小于最小日期!");
|
||||
selectDate = self.minDate;
|
||||
}
|
||||
if (selectMoreThanMax) {
|
||||
BRErrorLog(@"默认选择的日期不能大于最大日期!");
|
||||
selectDate = self.maxDate;
|
||||
}
|
||||
|
||||
return selectDate;
|
||||
}
|
||||
|
||||
#pragma mark - NSDate 转 NSString
|
||||
- (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat {
|
||||
return [NSDate br_stringFromDate:date dateFormat:dateFormat timeZone:self.timeZone language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
#pragma mark - NSString 转 NSDate
|
||||
- (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat {
|
||||
return [NSDate br_dateFromString:dateString dateFormat:dateFormat timeZone:self.timeZone language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
#pragma mark - 比较两个日期大小(可以指定比较级数,即按指定格式进行比较)
|
||||
- (NSComparisonResult)br_compareDate:(NSDate *)date targetDate:(NSDate *)targetDate dateFormat:(NSString *)dateFormat {
|
||||
NSString *dateString1 = [self br_stringFromDate:date dateFormat:dateFormat];
|
||||
NSString *dateString2 = [self br_stringFromDate:targetDate dateFormat:dateFormat];
|
||||
NSDate *date1 = [self br_dateFromString:dateString1 dateFormat:dateFormat];
|
||||
NSDate *date2 = [self br_dateFromString:dateString2 dateFormat:dateFormat];
|
||||
if ([date1 compare:date2] == NSOrderedDescending) {
|
||||
return 1; // 大于
|
||||
} else if ([date1 compare:date2] == NSOrderedAscending) {
|
||||
return -1; // 小于
|
||||
} else {
|
||||
return 0; // 等于
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - 获取 yearArr 数组
|
||||
- (NSArray *)getYearArr {
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = self.minDate.br_year; i <= self.maxDate.br_year; i++) {
|
||||
[tempArr addObject:[self getYearNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
NSArray *reversedArr = [[tempArr reverseObjectEnumerator] allObjects];
|
||||
tempArr = [reversedArr mutableCopy];
|
||||
}
|
||||
// 判断是否需要添加【自定义字符串】
|
||||
if (self.lastRowContent || self.firstRowContent) {
|
||||
switch (self.pickerMode) {
|
||||
case BRDatePickerModeYMDHMS:
|
||||
case BRDatePickerModeYMDHM:
|
||||
case BRDatePickerModeYMDH:
|
||||
case BRDatePickerModeYMD:
|
||||
case BRDatePickerModeYM:
|
||||
case BRDatePickerModeY:
|
||||
{
|
||||
if (self.lastRowContent) {
|
||||
[tempArr addObject:self.lastRowContent];
|
||||
}
|
||||
if (self.firstRowContent) {
|
||||
[tempArr insertObject:self.firstRowContent atIndex:0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 monthArr 数组
|
||||
- (NSArray *)getMonthArr:(NSInteger)year {
|
||||
NSInteger startMonth = 1;
|
||||
NSInteger endMonth = 12;
|
||||
if (year == self.minDate.br_year) {
|
||||
startMonth = self.minDate.br_month;
|
||||
}
|
||||
if (year == self.maxDate.br_year) {
|
||||
endMonth = self.maxDate.br_month;
|
||||
}
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = startMonth; i <= endMonth; i++) {
|
||||
[tempArr addObject:[self getMDHMSNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
NSArray *reversedArr = [[tempArr reverseObjectEnumerator] allObjects];
|
||||
tempArr = [reversedArr mutableCopy];
|
||||
}
|
||||
// 判断是否需要添加【自定义字符串】
|
||||
if (self.lastRowContent || self.firstRowContent) {
|
||||
switch (self.pickerMode) {
|
||||
case BRDatePickerModeMDHM:
|
||||
case BRDatePickerModeMD:
|
||||
{
|
||||
if (self.lastRowContent) {
|
||||
[tempArr addObject:self.lastRowContent];
|
||||
}
|
||||
if (self.firstRowContent) {
|
||||
[tempArr insertObject:self.firstRowContent atIndex:0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 dayArr 数组
|
||||
- (NSArray *)getDayArr:(NSInteger)year month:(NSInteger)month {
|
||||
NSInteger startDay = 1;
|
||||
NSInteger endDay = [NSDate br_getDaysInYear:year month:month];
|
||||
if (year == self.minDate.br_year && month == self.minDate.br_month) {
|
||||
startDay = self.minDate.br_day;
|
||||
}
|
||||
if (year == self.maxDate.br_year && month == self.maxDate.br_month) {
|
||||
endDay = self.maxDate.br_day;
|
||||
}
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = startDay; i <= endDay; i++) {
|
||||
[tempArr addObject:[self getMDHMSNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
return [[tempArr reverseObjectEnumerator] allObjects];
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 hourArr 数组
|
||||
- (NSArray *)getHourArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
|
||||
if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
|
||||
return @[[self getAMText], [self getPMText]];
|
||||
}
|
||||
|
||||
NSInteger startHour = 0;
|
||||
NSInteger endHour = 23;
|
||||
if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day) {
|
||||
startHour = self.minDate.br_hour;
|
||||
}
|
||||
if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day) {
|
||||
endHour = self.maxDate.br_hour;
|
||||
}
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = startHour; i <= endHour; i++) {
|
||||
[tempArr addObject:[self getMDHMSNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
NSArray *reversedArr = [[tempArr reverseObjectEnumerator] allObjects];
|
||||
tempArr = [reversedArr mutableCopy];
|
||||
}
|
||||
// 判断是否需要添加【自定义字符串】
|
||||
if (self.lastRowContent || self.firstRowContent) {
|
||||
switch (self.pickerMode) {
|
||||
case BRDatePickerModeHMS:
|
||||
case BRDatePickerModeHM:
|
||||
{
|
||||
if (self.lastRowContent) {
|
||||
[tempArr addObject:self.lastRowContent];
|
||||
}
|
||||
if (self.firstRowContent) {
|
||||
[tempArr insertObject:self.firstRowContent atIndex:0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 minuteArr 数组
|
||||
- (NSArray *)getMinuteArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
|
||||
NSInteger startMinute = 0;
|
||||
NSInteger endMinute = 59;
|
||||
if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day && hour == self.minDate.br_hour) {
|
||||
startMinute = self.minDate.br_minute;
|
||||
}
|
||||
if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day && hour == self.maxDate.br_hour) {
|
||||
endMinute = self.maxDate.br_minute;
|
||||
}
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = startMinute; i <= endMinute; i += self.minuteInterval) {
|
||||
[tempArr addObject:[self getMDHMSNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
NSArray *reversedArr = [[tempArr reverseObjectEnumerator] allObjects];
|
||||
tempArr = [reversedArr mutableCopy];
|
||||
}
|
||||
// 判断是否需要添加【自定义字符串】
|
||||
if (self.lastRowContent || self.firstRowContent) {
|
||||
switch (self.pickerMode) {
|
||||
case BRDatePickerModeMS:
|
||||
{
|
||||
if (self.lastRowContent) {
|
||||
[tempArr addObject:self.lastRowContent];
|
||||
}
|
||||
if (self.firstRowContent) {
|
||||
[tempArr insertObject:self.firstRowContent atIndex:0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 secondArr 数组
|
||||
- (NSArray *)getSecondArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
|
||||
NSInteger startSecond = 0;
|
||||
NSInteger endSecond = 59;
|
||||
if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day && hour == self.minDate.br_hour && minute == self.minDate.br_minute) {
|
||||
startSecond = self.minDate.br_second;
|
||||
}
|
||||
if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day && hour == self.maxDate.br_hour && minute == self.maxDate.br_minute) {
|
||||
endSecond = self.maxDate.br_second;
|
||||
}
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = startSecond; i <= endSecond; i += self.secondInterval) {
|
||||
[tempArr addObject:[self getMDHMSNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
return [[tempArr reverseObjectEnumerator] allObjects];
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 monthWeekArr 数组
|
||||
- (NSArray *)getMonthWeekArr:(NSInteger)year month:(NSInteger)month {
|
||||
NSInteger startWeek = 1;
|
||||
NSInteger endWeek = [NSDate br_getWeeksOfMonthInYear:year month:month];
|
||||
if (year == self.minDate.br_year && month == self.minDate.br_month) {
|
||||
startWeek = self.minDate.br_monthWeek;
|
||||
}
|
||||
if (year == self.maxDate.br_year && month == self.maxDate.br_month) {
|
||||
endWeek = self.maxDate.br_monthWeek;
|
||||
}
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = startWeek; i <= endWeek; i++) {
|
||||
[tempArr addObject:[self getMDHMSNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
return [[tempArr reverseObjectEnumerator] allObjects];
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 yearWeekArr 数组
|
||||
- (NSArray *)getYearWeekArr:(NSInteger)year {
|
||||
NSInteger startWeek = 1;
|
||||
NSInteger endWeek = [NSDate br_getWeeksOfYearInYear:year];
|
||||
if (year == self.minDate.br_year) {
|
||||
startWeek = self.minDate.br_yearWeek;
|
||||
}
|
||||
if (year == self.maxDate.br_year) {
|
||||
endWeek = self.maxDate.br_yearWeek;
|
||||
}
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = startWeek; i <= endWeek; i++) {
|
||||
[tempArr addObject:[self getMDHMSNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
return [[tempArr reverseObjectEnumerator] allObjects];
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 quarterArr 数组
|
||||
- (NSArray *)getQuarterArr:(NSInteger)year {
|
||||
NSInteger startQuarter = 1;
|
||||
NSInteger endQuarter = [NSDate br_getQuartersInYear:year];
|
||||
if (year == self.minDate.br_year) {
|
||||
startQuarter = self.minDate.br_quarter;
|
||||
}
|
||||
if (year == self.maxDate.br_year) {
|
||||
endQuarter = self.maxDate.br_quarter;
|
||||
}
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = startQuarter; i <= endQuarter; i++) {
|
||||
[tempArr addObject:[self getMDHMSNumber:i]];
|
||||
}
|
||||
if (self.isDescending) {
|
||||
return [[tempArr reverseObjectEnumerator] allObjects];
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
#pragma mark - 添加 pickerView
|
||||
- (void)setupPickerView:(UIView *)pickerView toView:(UIView *)view {
|
||||
if (view) {
|
||||
// 立即刷新容器视图 view 的布局(防止 view 使用自动布局时,选择器视图无法正常显示)
|
||||
[view setNeedsLayout];
|
||||
[view layoutIfNeeded];
|
||||
|
||||
self.frame = view.bounds;
|
||||
CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
|
||||
CGFloat pickerFooterViewHeight = self.pickerFooterView ? self.pickerFooterView.bounds.size.height : 0;
|
||||
pickerView.frame = CGRectMake(0, pickerHeaderViewHeight, view.bounds.size.width, view.bounds.size.height - pickerHeaderViewHeight - pickerFooterViewHeight);
|
||||
[self addSubview:pickerView];
|
||||
} else {
|
||||
// iOS16:重新设置 pickerView 高度(解决懒加载设置frame不生效问题)
|
||||
CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
|
||||
pickerView.frame = CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight);
|
||||
|
||||
[self.alertView addSubview:pickerView];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - 获取日期单位
|
||||
- (NSArray *)setupPickerUnitLabel:(UIPickerView *)pickerView unitArr:(NSArray *)unitArr {
|
||||
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
|
||||
for (NSInteger i = 0; i < pickerView.numberOfComponents; i++) {
|
||||
// label宽度
|
||||
CGFloat labelWidth = pickerView.bounds.size.width / pickerView.numberOfComponents;
|
||||
// 根据占位文本长度去计算宽度
|
||||
NSString *tempText = @"00";
|
||||
if (i == 0) {
|
||||
switch (self.pickerMode) {
|
||||
case BRDatePickerModeYMDHMS:
|
||||
case BRDatePickerModeYMDHM:
|
||||
case BRDatePickerModeYMDH:
|
||||
case BRDatePickerModeYMD:
|
||||
case BRDatePickerModeYM:
|
||||
case BRDatePickerModeY:
|
||||
{
|
||||
tempText = @"0123";
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 文本宽度
|
||||
CGFloat labelTextWidth = [tempText boundingRectWithSize:CGSizeMake(MAXFLOAT, self.pickerStyle.rowHeight)
|
||||
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
|
||||
attributes:@{NSFontAttributeName: self.pickerStyle.pickerTextFont}
|
||||
context:nil].size.width;
|
||||
// 单位label
|
||||
UILabel *unitLabel = [[UILabel alloc]init];
|
||||
unitLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
|
||||
unitLabel.backgroundColor = [UIColor clearColor];
|
||||
if (self.pickerMode != BRDatePickerModeYMDHMS) {
|
||||
unitLabel.textAlignment = NSTextAlignmentCenter;
|
||||
}
|
||||
unitLabel.font = self.pickerStyle.dateUnitTextFont;
|
||||
unitLabel.textColor = self.pickerStyle.dateUnitTextColor;
|
||||
// 字体自适应属性
|
||||
unitLabel.adjustsFontSizeToFitWidth = YES;
|
||||
// 自适应最小字体缩放比例
|
||||
unitLabel.minimumScaleFactor = 0.5f;
|
||||
unitLabel.text = (unitArr.count > 0 && i < unitArr.count) ? unitArr[i] : nil;
|
||||
|
||||
CGFloat originX = i * labelWidth + labelWidth / 2.0 + labelTextWidth / 2.0 + self.pickerStyle.dateUnitOffsetX;
|
||||
CGFloat originY = (pickerView.frame.size.height - self.pickerStyle.rowHeight) / 2 + self.pickerStyle.dateUnitOffsetY;
|
||||
unitLabel.frame = CGRectMake(originX, originY, MAX(self.pickerStyle.rowHeight, labelTextWidth), self.pickerStyle.rowHeight);
|
||||
|
||||
[tempArr addObject:unitLabel];
|
||||
|
||||
[pickerView addSubview:unitLabel];
|
||||
}
|
||||
|
||||
return [tempArr copy];
|
||||
}
|
||||
|
||||
- (NSString *)getYearNumber:(NSInteger)year {
|
||||
NSString *yearString = [NSString stringWithFormat:@"%@", @(year)];
|
||||
if (self.isNumberFullName) {
|
||||
yearString = [NSString stringWithFormat:@"%04d", [yearString intValue]];
|
||||
}
|
||||
return yearString;
|
||||
}
|
||||
|
||||
- (NSString *)getMDHMSNumber:(NSInteger)number {
|
||||
NSString *string = [NSString stringWithFormat:@"%@", @(number)];
|
||||
if (self.isNumberFullName) {
|
||||
string = [NSString stringWithFormat:@"%02d", [string intValue]];
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
||||
- (NSString *)getYearText:(NSArray *)yearArr row:(NSInteger)row {
|
||||
NSInteger index = 0;
|
||||
if (row >= 0) {
|
||||
index = MIN(row, yearArr.count - 1);
|
||||
}
|
||||
NSString *yearString = [yearArr objectAtIndex:index];
|
||||
if ((self.lastRowContent && [yearString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [yearString isEqualToString:self.firstRowContent])) {
|
||||
return yearString;
|
||||
}
|
||||
NSString *yearUnit = self.showUnitType == BRShowUnitTypeAll ? [self getYearUnit] : @"";
|
||||
return [NSString stringWithFormat:@"%@%@", yearString, yearUnit];
|
||||
}
|
||||
|
||||
- (NSString *)getMonthText:(NSArray *)monthArr row:(NSInteger)row {
|
||||
NSInteger index = 0;
|
||||
if (row >= 0) {
|
||||
index = MIN(row, monthArr.count - 1);
|
||||
}
|
||||
NSString *monthString = [monthArr objectAtIndex:index];
|
||||
// 首行/末行是自定义字符串,直接返回
|
||||
if ((self.firstRowContent && [monthString isEqualToString:self.firstRowContent]) || (self.lastRowContent && [monthString isEqualToString:self.lastRowContent])) {
|
||||
return monthString;
|
||||
}
|
||||
|
||||
// 自定义月份数据源
|
||||
if (self.monthNames && self.monthNames.count > 0) {
|
||||
NSInteger index = [monthString integerValue] - 1;
|
||||
monthString = (index >= 0 && index < self.monthNames.count) ? self.monthNames[index] : @"";
|
||||
} else {
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"] && (self.pickerMode == BRDatePickerModeYMD || self.pickerMode == BRDatePickerModeYM || self.pickerMode == BRDatePickerModeYMW)) {
|
||||
// 非中文环境:月份使用系统的月份名称
|
||||
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
|
||||
dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:self.pickerStyle.language];
|
||||
// monthSymbols: @[@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December"];
|
||||
// shortMonthSymbols: @[@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"];
|
||||
NSArray *monthNames = self.isShortMonthName ? dateFormatter.shortMonthSymbols : dateFormatter.monthSymbols;
|
||||
NSInteger index = [monthString integerValue] - 1;
|
||||
monthString = (index >= 0 && index < monthNames.count) ? monthNames[index] : @"";
|
||||
} else {
|
||||
// 中文环境:月份显示数字
|
||||
NSString *monthUnit = self.showUnitType == BRShowUnitTypeAll ? [self getMonthUnit] : @"";
|
||||
monthString = [NSString stringWithFormat:@"%@%@", monthString, monthUnit];
|
||||
}
|
||||
}
|
||||
|
||||
return monthString;
|
||||
}
|
||||
|
||||
- (NSString *)getDayText:(NSArray *)dayArr row:(NSInteger)row mSelectDate:(NSDate *)mSelectDate {
|
||||
NSInteger index = 0;
|
||||
if (row >= 0) {
|
||||
index = MIN(row, dayArr.count - 1);
|
||||
}
|
||||
NSString *dayString = [dayArr objectAtIndex:index];
|
||||
if (self.isShowToday && mSelectDate.br_year == [NSDate date].br_year && mSelectDate.br_month == [NSDate date].br_month && [dayString integerValue] == [NSDate date].br_day) {
|
||||
return [NSBundle br_localizedStringForKey:@"今天" language:self.pickerStyle.language];
|
||||
}
|
||||
NSString *dayUnit = self.showUnitType == BRShowUnitTypeAll ? [self getDayUnit] : @"";
|
||||
dayString = [NSString stringWithFormat:@"%@%@", dayString, dayUnit];
|
||||
if (self.isShowWeek) {
|
||||
NSDate *date = [NSDate br_setYear:mSelectDate.br_year month:mSelectDate.br_month day:[dayString integerValue]];
|
||||
NSString *weekdayString = [NSBundle br_localizedStringForKey:[date br_weekdayString] language:self.pickerStyle.language];
|
||||
dayString = [NSString stringWithFormat:@"%@%@", dayString, weekdayString];
|
||||
}
|
||||
return dayString;
|
||||
}
|
||||
|
||||
- (NSString *)getHourText:(NSArray *)hourArr row:(NSInteger)row {
|
||||
NSInteger index = 0;
|
||||
if (row >= 0) {
|
||||
index = MIN(row, hourArr.count - 1);
|
||||
}
|
||||
NSString *hourString = [hourArr objectAtIndex:index];
|
||||
if ((self.lastRowContent && [hourString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [hourString isEqualToString:self.firstRowContent])) {
|
||||
return hourString;
|
||||
}
|
||||
NSString *hourUnit = self.showUnitType == BRShowUnitTypeAll ? [self getHourUnit] : @"";
|
||||
return [NSString stringWithFormat:@"%@%@", hourString, hourUnit];
|
||||
}
|
||||
|
||||
- (NSString *)getMinuteText:(NSArray *)minuteArr row:(NSInteger)row {
|
||||
NSInteger index = 0;
|
||||
if (row >= 0) {
|
||||
index = MIN(row, minuteArr.count - 1);
|
||||
}
|
||||
NSString *minuteString = [minuteArr objectAtIndex:index];
|
||||
NSString *minuteUnit = self.showUnitType == BRShowUnitTypeAll ? [self getMinuteUnit] : @"";
|
||||
return [NSString stringWithFormat:@"%@%@", minuteString, minuteUnit];
|
||||
}
|
||||
|
||||
- (NSString *)getSecondText:(NSArray *)secondArr row:(NSInteger)row {
|
||||
NSInteger index = 0;
|
||||
if (row >= 0) {
|
||||
index = MIN(row, secondArr.count - 1);
|
||||
}
|
||||
NSString *secondString = [secondArr objectAtIndex:index];
|
||||
NSString *secondUnit = self.showUnitType == BRShowUnitTypeAll ? [self getSecondUnit] : @"";
|
||||
return [NSString stringWithFormat:@"%@%@", secondString, secondUnit];
|
||||
}
|
||||
|
||||
- (NSString *)getWeekText:(NSArray *)weekArr row:(NSInteger)row {
|
||||
NSInteger index = 0;
|
||||
if (row >= 0) {
|
||||
index = MIN(row, weekArr.count - 1);
|
||||
}
|
||||
NSString *weekString = [weekArr objectAtIndex:index];
|
||||
if ((self.lastRowContent && [weekString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [weekString isEqualToString:self.firstRowContent])) {
|
||||
return weekString;
|
||||
}
|
||||
NSString *weekUnit = self.showUnitType == BRShowUnitTypeAll ? [self getWeekUnit] : @"";
|
||||
return [NSString stringWithFormat:@"%@%@", weekString, weekUnit];
|
||||
}
|
||||
|
||||
- (NSString *)getQuarterText:(NSArray *)quarterArr row:(NSInteger)row {
|
||||
NSInteger index = 0;
|
||||
if (row >= 0) {
|
||||
index = MIN(row, quarterArr.count - 1);
|
||||
}
|
||||
NSString *quarterString = [quarterArr objectAtIndex:index];
|
||||
if ((self.lastRowContent && [quarterString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [quarterString isEqualToString:self.firstRowContent])) {
|
||||
return quarterString;
|
||||
}
|
||||
NSString *quarterUnit = self.showUnitType == BRShowUnitTypeAll ? [self getQuarterUnit] : @"";
|
||||
return [NSString stringWithFormat:@"%@%@", quarterString, quarterUnit];
|
||||
}
|
||||
|
||||
- (NSString *)getAMText {
|
||||
return [NSBundle br_localizedStringForKey:@"上午" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getPMText {
|
||||
return [NSBundle br_localizedStringForKey:@"下午" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getYearUnit {
|
||||
if (self.customUnit) {
|
||||
return self.customUnit[@"year"] ? : @"";
|
||||
}
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"]) {
|
||||
return @"";
|
||||
}
|
||||
return [NSBundle br_localizedStringForKey:@"年" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getMonthUnit {
|
||||
if (self.customUnit) {
|
||||
return self.customUnit[@"month"] ? : @"";
|
||||
}
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"]) {
|
||||
return @"";
|
||||
}
|
||||
return [NSBundle br_localizedStringForKey:@"月" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getDayUnit {
|
||||
if (self.customUnit) {
|
||||
return self.customUnit[@"day"] ? : @"";
|
||||
}
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"]) {
|
||||
return @"";
|
||||
}
|
||||
return [NSBundle br_localizedStringForKey:@"日" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getHourUnit {
|
||||
if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
|
||||
return @"";
|
||||
}
|
||||
if (self.customUnit) {
|
||||
return self.customUnit[@"hour"] ? : @"";
|
||||
}
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"]) {
|
||||
return @"";
|
||||
}
|
||||
return [NSBundle br_localizedStringForKey:@"时" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getMinuteUnit {
|
||||
if (self.customUnit) {
|
||||
return self.customUnit[@"minute"] ? : @"";
|
||||
}
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"]) {
|
||||
return @"";
|
||||
}
|
||||
return [NSBundle br_localizedStringForKey:@"分" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getSecondUnit {
|
||||
if (self.customUnit) {
|
||||
return self.customUnit[@"second"] ? : @"";
|
||||
}
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"]) {
|
||||
return @"";
|
||||
}
|
||||
return [NSBundle br_localizedStringForKey:@"秒" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getWeekUnit {
|
||||
if (self.customUnit) {
|
||||
return self.customUnit[@"week"] ? : @"";
|
||||
}
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"]) {
|
||||
return @"";
|
||||
}
|
||||
return [NSBundle br_localizedStringForKey:@"周" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSString *)getQuarterUnit {
|
||||
if (self.customUnit) {
|
||||
return self.customUnit[@"quarter"] ? : @"";
|
||||
}
|
||||
if (![self.pickerStyle.language hasPrefix:@"zh"]) {
|
||||
return @"";
|
||||
}
|
||||
return [NSBundle br_localizedStringForKey:@"季度" language:self.pickerStyle.language];
|
||||
}
|
||||
|
||||
- (NSInteger)getIndexWithArray:(NSArray *)array object:(NSString *)obj {
|
||||
if (!array || array.count == 0 || !obj) {
|
||||
return 0;
|
||||
}
|
||||
if ([array containsObject:obj]) {
|
||||
return [array indexOfObject:obj];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@end
|
||||
274
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.h
generated
Executable file
274
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.h
generated
Executable file
@@ -0,0 +1,274 @@
|
||||
//
|
||||
// BRDatePickerView.h
|
||||
// BRPickerViewDemo
|
||||
//
|
||||
// Created by renbo on 2017/8/11.
|
||||
// Copyright © 2017 irenb. All rights reserved.
|
||||
//
|
||||
// 最新代码下载地址:https://github.com/91renb/BRPickerView
|
||||
|
||||
#import "BRBaseView.h"
|
||||
#import "NSDate+BRPickerView.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// 日期选择器格式
|
||||
typedef NS_ENUM(NSInteger, BRDatePickerMode) {
|
||||
// ----- 以下4种是系统样式(兼容国际化日期格式) -----
|
||||
/** 【yyyy-MM-dd】UIDatePickerModeDate(美式日期:MM-dd-yyyy;英式日期:dd-MM-yyyy)*/
|
||||
BRDatePickerModeDate,
|
||||
/** 【yyyy-MM-dd HH:mm】 UIDatePickerModeDateAndTime */
|
||||
BRDatePickerModeDateAndTime,
|
||||
/** 【HH:mm】UIDatePickerModeTime */
|
||||
BRDatePickerModeTime,
|
||||
/** 【HH:mm】UIDatePickerModeCountDownTimer */
|
||||
BRDatePickerModeCountDownTimer,
|
||||
|
||||
// ----- 以下14种是自定义样式 -----
|
||||
/** 【yyyy-MM-dd HH:mm:ss】年月日时分秒 */
|
||||
BRDatePickerModeYMDHMS,
|
||||
/** 【yyyy-MM-dd HH:mm】年月日时分 */
|
||||
BRDatePickerModeYMDHM,
|
||||
/** 【yyyy-MM-dd HH】年月日时 */
|
||||
BRDatePickerModeYMDH,
|
||||
/** 【MM-dd HH:mm】月日时分 */
|
||||
BRDatePickerModeMDHM,
|
||||
/** 【yyyy-MM-dd】年月日(兼容国际化日期:dd-MM-yyyy)*/
|
||||
BRDatePickerModeYMD,
|
||||
/** 【yyyy-MM】年月(兼容国际化日期:MM-yyyy)*/
|
||||
BRDatePickerModeYM,
|
||||
/** 【yyyy】年 */
|
||||
BRDatePickerModeY,
|
||||
/** 【MM-dd】月日 */
|
||||
BRDatePickerModeMD,
|
||||
/** 【HH:mm:ss】时分秒 */
|
||||
BRDatePickerModeHMS,
|
||||
/** 【HH:mm】时分 */
|
||||
BRDatePickerModeHM,
|
||||
/** 【mm:ss】分秒 */
|
||||
BRDatePickerModeMS,
|
||||
|
||||
/** 【yyyy-qq】年季度 */
|
||||
BRDatePickerModeYQ,
|
||||
/** 【yyyy-MM-ww】年月周 */
|
||||
BRDatePickerModeYMW,
|
||||
/** 【yyyy-ww】年周 */
|
||||
BRDatePickerModeYW
|
||||
};
|
||||
|
||||
/// 日期单位显示的位置
|
||||
typedef NS_ENUM(NSInteger, BRShowUnitType) {
|
||||
/** 日期单位显示全部行(默认)*/
|
||||
BRShowUnitTypeAll,
|
||||
/** 日期单位仅显示中间行 */
|
||||
BRShowUnitTypeOnlyCenter,
|
||||
/** 日期单位不显示(隐藏日期单位)*/
|
||||
BRShowUnitTypeNone
|
||||
};
|
||||
|
||||
typedef void (^BRDateResultBlock)(NSDate * _Nullable selectDate, NSString * _Nullable selectValue);
|
||||
|
||||
typedef void (^BRDateResultRangeBlock)(NSDate * _Nullable selectStartDate, NSDate * _Nullable selectEndDate, NSString * _Nullable selectValue);
|
||||
|
||||
@interface BRDatePickerView : BRBaseView
|
||||
|
||||
/**
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// 【用法一】
|
||||
/// 特点:灵活,扩展性强(推荐使用!)
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
/** 日期选择器显示类型 */
|
||||
@property (nonatomic, assign) BRDatePickerMode pickerMode;
|
||||
|
||||
/** 设置选中的日期(推荐使用 selectDate) */
|
||||
@property (nullable, nonatomic, strong) NSDate *selectDate;
|
||||
@property (nullable, nonatomic, copy) NSString *selectValue;
|
||||
|
||||
/** 最小日期(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)*/
|
||||
@property (nullable, nonatomic, strong) NSDate *minDate;
|
||||
/** 最大日期(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)*/
|
||||
@property (nullable, nonatomic, strong) NSDate *maxDate;
|
||||
|
||||
/** 选择结果的回调 */
|
||||
@property (nullable, nonatomic, copy) BRDateResultBlock resultBlock;
|
||||
/** 选择结果范围的回调:for `BRDatePickerModeYQ`、`BRDatePickerModeYMW`、`BRDatePickerModeYW`, ignored otherwise. */
|
||||
@property (nullable, nonatomic, copy) BRDateResultRangeBlock resultRangeBlock;
|
||||
|
||||
/** 滚动选择时触发的回调 */
|
||||
@property (nullable, nonatomic, copy) BRDateResultBlock changeBlock;
|
||||
/** 滚动选择范围时触发的回调:for `BRDatePickerModeYQ`、`BRDatePickerModeYMW`、`BRDatePickerModeYW`, ignored otherwise. */
|
||||
@property (nullable, nonatomic, copy) BRDateResultRangeBlock changeRangeBlock;
|
||||
|
||||
/** 日期单位显示类型 */
|
||||
@property (nonatomic, assign) BRShowUnitType showUnitType;
|
||||
|
||||
/** 是否显示【星期】,默认为 NO */
|
||||
@property (nonatomic, assign, getter=isShowWeek) BOOL showWeek;
|
||||
|
||||
/** 是否显示【今天】,默认为 NO */
|
||||
@property (nonatomic, assign, getter=isShowToday) BOOL showToday;
|
||||
|
||||
/** 是否添加【至今】,默认为 NO */
|
||||
@property (nonatomic, assign, getter=isAddToNow) BOOL addToNow;
|
||||
|
||||
/** 首行添加【自定义字符串】,配合 selectValue 可设置默认选中 */
|
||||
@property (nullable, nonatomic, copy) NSString *firstRowContent;
|
||||
|
||||
/** 末行添加【自定义字符串】,配合 selectValue 可设置默认选中 */
|
||||
@property (nullable, nonatomic, copy) NSString *lastRowContent;
|
||||
|
||||
/** 最后一行,添加【自定义字符串】 */
|
||||
@property (nullable, nonatomic, copy) NSString *addCustomString DEPRECATED_MSG_ATTRIBUTE("Use 'lastRowContent' instead");
|
||||
|
||||
/** 滚轮上日期数据排序是否降序,默认为 NO(升序)*/
|
||||
@property (nonatomic, assign, getter=isDescending) BOOL descending;
|
||||
|
||||
/** 选择器上数字是否带有前导零,默认为 NO(如:无前导零:2020-1-1;有前导零:2020-01-01)*/
|
||||
@property (nonatomic, assign, getter=isNumberFullName) BOOL numberFullName;
|
||||
|
||||
/** 设置分的时间间隔,默认为1(范围:1 ~ 30)*/
|
||||
@property (nonatomic, assign) NSInteger minuteInterval;
|
||||
|
||||
/** 设置秒的时间间隔,默认为1(范围:1 ~ 30)*/
|
||||
@property (nonatomic, assign) NSInteger secondInterval;
|
||||
|
||||
/** 设置倒计时的时长,默认为0(范围:0 ~ 24*60*60-1,单位为秒) for `BRDatePickerModeCountDownTimer`, ignored otherwise. */
|
||||
@property (nonatomic, assign) NSTimeInterval countDownDuration;
|
||||
|
||||
/**
|
||||
* 自定义月份数据源
|
||||
* 如:@[@"1月", @"2月",..., @"12月"]、 @[@"一月", @"二月",..., @"十二月"]、 @[@"Jan", @"Feb",..., @"Dec"] 等
|
||||
*/
|
||||
@property (nonatomic, copy) NSArray <NSString *> *monthNames;
|
||||
|
||||
/**
|
||||
* 设置国际化日期(非中文环境下)月份是否显示简称,默认为 NO。for `BRDatePickerModeYMD` and `BRDatePickerModeYM`, ignored otherwise.
|
||||
* 如:January 的简称为:Jan
|
||||
*/
|
||||
@property (nonatomic, assign, getter=isShortMonthName) BOOL shortMonthName;
|
||||
|
||||
/**
|
||||
* 自定义日期单位
|
||||
* 字典格式:@{@"year": @"年", @"month": @"月", @"day": @"日", @"hour": @"时", @"minute": @"分", @"second": @"秒"}
|
||||
*/
|
||||
@property (nonatomic, copy) NSDictionary *customUnit;
|
||||
|
||||
/** 显示上午和下午,默认为 NO. for `BRDatePickerModeYMDH`, ignored otherwise. */
|
||||
@property (nonatomic, assign, getter=isShowAMAndPM) BOOL showAMAndPM;
|
||||
|
||||
/** 设置时区,默认为当前时区 */
|
||||
@property (nullable, nonatomic, copy) NSTimeZone *timeZone;
|
||||
|
||||
/** default is [NSCalendar currentCalendar]. setting nil returns to default. for `UIDatePicker` */
|
||||
@property (nonatomic, copy) NSCalendar *calendar;
|
||||
|
||||
/** 指定不允许选择的日期 */
|
||||
@property (nullable, nonatomic, copy) NSArray <NSDate *> *nonSelectableDates;
|
||||
|
||||
/** 不允许选择日期的回调 */
|
||||
@property (nullable, nonatomic, copy) BRDateResultBlock nonSelectableBlock;
|
||||
|
||||
/// 初始化日期选择器
|
||||
/// @param pickerMode 日期选择器显示类型
|
||||
- (instancetype)initWithPickerMode:(BRDatePickerMode)pickerMode;
|
||||
|
||||
/// 弹出选择器视图
|
||||
- (void)show;
|
||||
|
||||
/// 关闭选择器视图
|
||||
- (void)dismiss;
|
||||
|
||||
|
||||
|
||||
|
||||
//================================================= 华丽的分割线 =================================================
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// 【用法二】:快捷使用,直接选择下面其中的一个方法进行使用
|
||||
/// 特点:快捷,方便
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
/**
|
||||
* 1.显示日期选择器
|
||||
*
|
||||
* @param mode 日期显示类型
|
||||
* @param title 选择器标题
|
||||
* @param selectValue 默认选中的日期(默认选中当前日期)
|
||||
* @param resultBlock 选择结果的回调
|
||||
*
|
||||
*/
|
||||
+ (void)showDatePickerWithMode:(BRDatePickerMode)mode
|
||||
title:(nullable NSString *)title
|
||||
selectValue:(nullable NSString *)selectValue
|
||||
resultBlock:(nullable BRDateResultBlock)resultBlock;
|
||||
|
||||
/**
|
||||
* 2.显示日期选择器
|
||||
*
|
||||
* @param mode 日期显示类型
|
||||
* @param title 选择器标题
|
||||
* @param selectValue 默认选中的日期(默认选中当前日期)
|
||||
* @param isAutoSelect 是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
|
||||
* @param resultBlock 选择结果的回调
|
||||
*
|
||||
*/
|
||||
+ (void)showDatePickerWithMode:(BRDatePickerMode)mode
|
||||
title:(nullable NSString *)title
|
||||
selectValue:(nullable NSString *)selectValue
|
||||
isAutoSelect:(BOOL)isAutoSelect
|
||||
resultBlock:(nullable BRDateResultBlock)resultBlock;
|
||||
|
||||
/**
|
||||
* 3.显示日期选择器
|
||||
*
|
||||
* @param mode 日期显示类型
|
||||
* @param title 选择器标题
|
||||
* @param selectValue 默认选中的日期(默认选中当前日期)
|
||||
* @param minDate 最小日期(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)
|
||||
* @param maxDate 最大日期(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)
|
||||
* @param isAutoSelect 是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
|
||||
* @param resultBlock 选择结果的回调
|
||||
*
|
||||
*/
|
||||
+ (void)showDatePickerWithMode:(BRDatePickerMode)mode
|
||||
title:(nullable NSString *)title
|
||||
selectValue:(nullable NSString *)selectValue
|
||||
minDate:(nullable NSDate *)minDate
|
||||
maxDate:(nullable NSDate *)maxDate
|
||||
isAutoSelect:(BOOL)isAutoSelect
|
||||
resultBlock:(nullable BRDateResultBlock)resultBlock;
|
||||
|
||||
/**
|
||||
* 3.显示日期选择器
|
||||
*
|
||||
* @param mode 日期显示类型
|
||||
* @param title 选择器标题
|
||||
* @param selectValue 默认选中的日期(默认选中当前日期)
|
||||
* @param minDate 最小日期(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)
|
||||
* @param maxDate 最大日期(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)
|
||||
* @param isAutoSelect 是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
|
||||
* @param resultBlock 选择结果的回调
|
||||
* @param resultRangeBlock 范围选择结果的回调
|
||||
*
|
||||
*/
|
||||
+ (void)showDatePickerWithMode:(BRDatePickerMode)mode
|
||||
title:(nullable NSString *)title
|
||||
selectValue:(nullable NSString *)selectValue
|
||||
minDate:(nullable NSDate *)minDate
|
||||
maxDate:(nullable NSDate *)maxDate
|
||||
isAutoSelect:(BOOL)isAutoSelect
|
||||
resultBlock:(nullable BRDateResultBlock)resultBlock
|
||||
resultRangeBlock:(nullable BRDateResultRangeBlock)resultRangeBlock;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
1965
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.m
generated
Executable file
1965
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.m
generated
Executable file
File diff suppressed because it is too large
Load Diff
126
Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.h
generated
Normal file
126
Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.h
generated
Normal file
@@ -0,0 +1,126 @@
|
||||
//
|
||||
// NSDate+BRPickerView.h
|
||||
// BRPickerViewDemo
|
||||
//
|
||||
// Created by renbo on 2018/3/15.
|
||||
// Copyright © 2018 irenb. All rights reserved.
|
||||
//
|
||||
// 最新代码下载地址:https://github.com/91renb/BRPickerView
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface NSDate (BRPickerView)
|
||||
/// 获取指定date的详细信息
|
||||
@property (readonly) NSInteger br_year; // 年
|
||||
@property (readonly) NSInteger br_month; // 月
|
||||
@property (readonly) NSInteger br_day; // 日
|
||||
@property (readonly) NSInteger br_hour; // 时
|
||||
@property (readonly) NSInteger br_minute; // 分
|
||||
@property (readonly) NSInteger br_second; // 秒
|
||||
@property (readonly) NSInteger br_weekday; // 星期
|
||||
@property (readonly) NSInteger br_monthWeek; // 月周
|
||||
@property (readonly) NSInteger br_yearWeek; // 年周
|
||||
@property (readonly) NSInteger br_quarter; // 季度
|
||||
|
||||
/** 获取中文星期字符串 */
|
||||
@property (nullable, nonatomic, readonly, copy) NSString *br_weekdayString;
|
||||
|
||||
/** 获取日历单例对象 */
|
||||
+ (NSCalendar *)br_calendar;
|
||||
|
||||
|
||||
/// ---------------- 创建 date ----------------
|
||||
/** 通过 NSDateComponents对象 来创建 NSDate对象(可以设置时区) */
|
||||
+ (nullable NSDate *)br_setDateFromComponents:(NSDateComponents *)components timeZone:(NSTimeZone *)timeZone;
|
||||
|
||||
/** yyyy */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year;
|
||||
|
||||
/** yyyy-MM */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month;
|
||||
|
||||
/** yyyy-MM-dd */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day;
|
||||
|
||||
/** yyyy-MM-dd HH */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour;
|
||||
|
||||
/** yyyy-MM-dd HH:mm */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute;
|
||||
|
||||
/** yyyy-MM-dd HH:mm:ss */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second;
|
||||
|
||||
/** MM-dd HH:mm */
|
||||
+ (nullable NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute;
|
||||
|
||||
/** MM-dd */
|
||||
+ (nullable NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day;
|
||||
|
||||
/** HH:mm:ss */
|
||||
+ (nullable NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second;
|
||||
|
||||
/** HH:mm */
|
||||
+ (nullable NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute;
|
||||
|
||||
/** mm:ss */
|
||||
+ (nullable NSDate *)br_setMinute:(NSInteger)minute second:(NSInteger)second;
|
||||
|
||||
/** yyyy-MM-ww */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month weekOfMonth:(NSInteger)weekOfMont;
|
||||
|
||||
/** yyyy-ww */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year weekOfYear:(NSInteger)weekOfYear;
|
||||
|
||||
/** yyyy-qq */
|
||||
+ (nullable NSDate *)br_setYear:(NSInteger)year quarter:(NSInteger)quarter;
|
||||
|
||||
|
||||
/** 获取某个月的天数(通过年月求每月天数)*/
|
||||
+ (NSUInteger)br_getDaysInYear:(NSInteger)year month:(NSInteger)month;
|
||||
|
||||
/** 获取某个月的周数(通过年月求该月周数)*/
|
||||
+ (NSUInteger)br_getWeeksOfMonthInYear:(NSInteger)year month:(NSInteger)month;
|
||||
|
||||
/** 获取某一年的周数(通过年求该年周数)*/
|
||||
+ (NSUInteger)br_getWeeksOfYearInYear:(NSInteger)year;
|
||||
|
||||
/** 获取某一年的季度数(通过年求该年季度数)*/
|
||||
+ (NSUInteger)br_getQuartersInYear:(NSInteger)year;
|
||||
|
||||
/** 获取 日期加上/减去某天数后的新日期 */
|
||||
- (nullable NSDate *)br_getNewDateToDays:(NSTimeInterval)days;
|
||||
|
||||
/** 获取 日期加上/减去某个月数后的新日期 */
|
||||
- (nullable NSDate *)br_getNewDateToMonths:(NSTimeInterval)months;
|
||||
|
||||
/** NSDate 转 NSString */
|
||||
+ (nullable NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat;
|
||||
/** NSDate 转 NSString */
|
||||
+ (nullable NSString *)br_stringFromDate:(NSDate *)date
|
||||
dateFormat:(NSString *)dateFormat
|
||||
timeZone:(nullable NSTimeZone *)timeZone
|
||||
language:(nullable NSString *)language;
|
||||
|
||||
|
||||
/** NSString 转 NSDate */
|
||||
+ (nullable NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat;
|
||||
/** NSString 转 NSDate */
|
||||
+ (nullable NSDate *)br_dateFromString:(NSString *)dateString
|
||||
dateFormat:(NSString *)dateFormat
|
||||
timeZone:(nullable NSTimeZone *)timeZone
|
||||
language:(nullable NSString *)language;
|
||||
|
||||
|
||||
/** NSDate 转 NSString(已弃用) */
|
||||
+ (nullable NSString *)br_getDateString:(NSDate *)date format:(NSString *)format DEPRECATED_MSG_ATTRIBUTE("Use 'br_stringFromDate:dateFormat:' instead");
|
||||
|
||||
/** NSString 转 NSDate(已弃用) */
|
||||
+ (nullable NSDate *)br_getDate:(NSString *)dateString format:(NSString *)format DEPRECATED_MSG_ATTRIBUTE("Use 'br_dateFromString:dateFormat:' instead");
|
||||
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
400
Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.m
generated
Normal file
400
Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.m
generated
Normal file
@@ -0,0 +1,400 @@
|
||||
//
|
||||
// NSDate+BRPickerView.m
|
||||
// BRPickerViewDemo
|
||||
//
|
||||
// Created by renbo on 2018/3/15.
|
||||
// Copyright © 2018 irenb. All rights reserved.
|
||||
//
|
||||
// 最新代码下载地址:https://github.com/91renb/BRPickerView
|
||||
|
||||
#import "NSDate+BRPickerView.h"
|
||||
#import "BRPickerViewMacro.h"
|
||||
|
||||
BRSYNTH_DUMMY_CLASS(NSDate_BRPickerView)
|
||||
|
||||
static const NSCalendarUnit unitFlags = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfYear | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal | NSCalendarUnitQuarter);
|
||||
|
||||
@implementation NSDate (BRPickerView)
|
||||
|
||||
#pragma mark - 获取日历单例对象
|
||||
+ (NSCalendar *)br_calendar {
|
||||
static NSCalendar *sharedCalendar = nil;
|
||||
if (!sharedCalendar) {
|
||||
// 创建日历对象,指定日历的算法(公历/阳历)
|
||||
sharedCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
|
||||
// NSCalendar 设置时区
|
||||
//sharedCalendar.timeZone = [NSTimeZone timeZoneWithName:@"America/Chicago"];
|
||||
}
|
||||
return sharedCalendar;
|
||||
}
|
||||
|
||||
#pragma mark - NSDate 转 NSDateComponents
|
||||
+ (NSDateComponents *)br_componentsFromDate:(NSDate *)date {
|
||||
// 通过日历类 NSCalendar 进行转换
|
||||
NSCalendar *calendar = [self br_calendar];
|
||||
// NSDateComponents 可以获得日期的详细信息,即日期的组成
|
||||
return [calendar components:unitFlags fromDate:date];
|
||||
}
|
||||
|
||||
#pragma mark - NSDateComponents 转 NSDate
|
||||
+ (NSDate *)br_dateFromComponents:(NSDateComponents *)components {
|
||||
// 通过日历类 NSCalendar 进行转换
|
||||
NSCalendar *calendar = [self br_calendar];
|
||||
return [calendar dateFromComponents:components];
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的年份
|
||||
- (NSInteger)br_year {
|
||||
return [NSDate br_componentsFromDate:self].year;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的月份
|
||||
- (NSInteger)br_month {
|
||||
return [NSDate br_componentsFromDate:self].month;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的天
|
||||
- (NSInteger)br_day {
|
||||
return [NSDate br_componentsFromDate:self].day;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的小时
|
||||
- (NSInteger)br_hour {
|
||||
return [NSDate br_componentsFromDate:self].hour;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的分钟
|
||||
- (NSInteger)br_minute {
|
||||
return [NSDate br_componentsFromDate:self].minute;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的秒
|
||||
- (NSInteger)br_second {
|
||||
return [NSDate br_componentsFromDate:self].second;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的星期
|
||||
- (NSInteger)br_weekday {
|
||||
return [NSDate br_componentsFromDate:self].weekday;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的月周
|
||||
- (NSInteger)br_monthWeek {
|
||||
return [NSDate br_componentsFromDate:self].weekOfMonth;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的年周
|
||||
- (NSInteger)br_yearWeek {
|
||||
return [NSDate br_componentsFromDate:self].weekOfYear;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的季度
|
||||
- (NSInteger)br_quarter {
|
||||
// [NSDate br_componentsFromDate:self].quarter; // 取到的季度值总是0?
|
||||
NSInteger quarter = 1;
|
||||
NSInteger month = self.br_month;
|
||||
if (month > 3) quarter = 2;
|
||||
if (month > 6) quarter = 3;
|
||||
if (month > 9) quarter = 4;
|
||||
|
||||
return quarter;
|
||||
}
|
||||
|
||||
#pragma mark - 获取指定日期的星期
|
||||
- (NSString *)br_weekdayString {
|
||||
switch (self.br_weekday - 1) {
|
||||
case 0:
|
||||
{
|
||||
return @"周日";
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
return @"周一";
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
return @"周二";
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
return @"周三";
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
return @"周四";
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
{
|
||||
return @"周五";
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
{
|
||||
return @"周六";
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return @"";
|
||||
}
|
||||
|
||||
/// ---------------- 创建 date ----------------
|
||||
#pragma mark - 通过 NSDateComponents对象 来创建 NSDate对象(可以设置时区)
|
||||
+ (nullable NSDate *)br_setDateFromComponents:(NSDateComponents *)components timeZone:(NSTimeZone *)timeZone {
|
||||
// 创建日历对象,指定日历的算法(公历/阳历)
|
||||
NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
|
||||
if (timeZone) {
|
||||
// NSCalendar 设置时区
|
||||
calendar.timeZone = timeZone;
|
||||
}
|
||||
return [calendar dateFromComponents:components];
|
||||
}
|
||||
|
||||
#pragma mark - 创建date(通过 NSCalendar 类来创建日期)
|
||||
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
|
||||
return [self br_setYear:year month:month day:day hour:hour minute:minute second:second weekOfMonth:0 weekOfYear:0 quarter:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day
|
||||
hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second
|
||||
weekOfMonth:(NSInteger)weekOfMonth weekOfYear:(NSInteger)weekOfYear quarter:(NSInteger)quarter {
|
||||
NSDateComponents *components = [self br_componentsFromDate:[NSDate date]];
|
||||
if (year > 0) {
|
||||
// 初始化日期组件
|
||||
components = [[NSDateComponents alloc]init];
|
||||
components.year = year;
|
||||
}
|
||||
if (month > 0) {
|
||||
components.month = month;
|
||||
}
|
||||
if (day > 0) {
|
||||
components.day = day;
|
||||
}
|
||||
if (hour >= 0) {
|
||||
components.hour = hour;
|
||||
}
|
||||
if (minute >= 0) {
|
||||
components.minute = minute;
|
||||
}
|
||||
if (second >= 0) {
|
||||
components.second = second;
|
||||
}
|
||||
if (weekOfMonth > 0) {
|
||||
components.weekOfMonth = weekOfMonth;
|
||||
}
|
||||
if (weekOfYear > 0) {
|
||||
components.weekOfYear = weekOfYear;
|
||||
}
|
||||
if (quarter > 0) {
|
||||
components.quarter = quarter;
|
||||
}
|
||||
|
||||
return [self br_dateFromComponents:components];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
|
||||
return [self br_setYear:year month:month day:day hour:hour minute:minute second:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
|
||||
return [self br_setYear:year month:month day:day hour:hour minute:0 second:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
|
||||
return [self br_setYear:year month:month day:day hour:0 minute:0 second:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month {
|
||||
return [self br_setYear:year month:month day:0 hour:0 minute:0 second:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year {
|
||||
return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
|
||||
return [self br_setYear:0 month:month day:day hour:hour minute:minute second:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day {
|
||||
return [self br_setYear:0 month:month day:day hour:0 minute:0 second:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
|
||||
return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:second];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute {
|
||||
return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setMinute:(NSInteger)minute second:(NSInteger)second {
|
||||
return [self br_setYear:0 month:0 day:0 hour:0 minute:minute second:second];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month weekOfMonth:(NSInteger)weekOfMonth {
|
||||
return [self br_setYear:year month:month day:0 hour:0 minute:0 second:0 weekOfMonth:weekOfMonth weekOfYear:0 quarter:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year weekOfYear:(NSInteger)weekOfYear {
|
||||
return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0 weekOfMonth:0 weekOfYear:weekOfYear quarter:0];
|
||||
}
|
||||
|
||||
+ (NSDate *)br_setYear:(NSInteger)year quarter:(NSInteger)quarter {
|
||||
return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0 weekOfMonth:0 weekOfYear:0 quarter:quarter];
|
||||
}
|
||||
|
||||
#pragma mark - 获取某个月的天数(通过年月求每月天数)
|
||||
+ (NSUInteger)br_getDaysInYear:(NSInteger)year month:(NSInteger)month {
|
||||
BOOL isLeapYear = year % 4 == 0 ? (year % 100 == 0 ? (year % 400 == 0 ? YES : NO) : YES) : NO;
|
||||
switch (month) {
|
||||
case 1:
|
||||
case 3:
|
||||
case 5:
|
||||
case 7:
|
||||
case 8:
|
||||
case 10:
|
||||
case 12:
|
||||
{
|
||||
return 31;
|
||||
}
|
||||
case 4:
|
||||
case 6:
|
||||
case 9:
|
||||
case 11:
|
||||
{
|
||||
return 30;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (isLeapYear) {
|
||||
return 29;
|
||||
} else {
|
||||
return 28;
|
||||
}
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#pragma mark - 获取某个月的周数(通过年月求该月周数)
|
||||
+ (NSUInteger)br_getWeeksOfMonthInYear:(NSInteger)year month:(NSInteger)month {
|
||||
NSUInteger lastDayOfMonth = [self br_getDaysInYear:year month:month];
|
||||
NSDate *endDate = [self br_setYear:year month:month day:lastDayOfMonth];
|
||||
return endDate.br_monthWeek;
|
||||
}
|
||||
|
||||
#pragma mark - 获取某一年的周数(通过年求该年周数)
|
||||
+ (NSUInteger)br_getWeeksOfYearInYear:(NSInteger)year {
|
||||
NSDate *endDate = [self br_setYear:year month:12 day:31];
|
||||
NSInteger weeks = endDate.br_yearWeek;
|
||||
if (weeks == 1) weeks = 52;
|
||||
return weeks;
|
||||
}
|
||||
|
||||
#pragma mark - 获取某一年的季度数(通过年求该年季度数)
|
||||
+ (NSUInteger)br_getQuartersInYear:(NSInteger)year {
|
||||
NSDate *endDate = [self br_setYear:year month:12 day:31];
|
||||
return endDate.br_quarter;
|
||||
}
|
||||
|
||||
#pragma mark - 获取 日期加上/减去某天数后的新日期
|
||||
- (NSDate *)br_getNewDateToDays:(NSTimeInterval)days {
|
||||
// days 为正数时,表示几天之后的日期;负数表示几天之前的日期
|
||||
return [self dateByAddingTimeInterval:60 * 60 * 24 * days];
|
||||
}
|
||||
|
||||
#pragma mark - 获取 日期加上/减去某个月数后的新日期
|
||||
- (nullable NSDate *)br_getNewDateToMonths:(NSTimeInterval)months {
|
||||
// months 为正数时,表示几个月之后的日期;负数表示几个月之前的日期
|
||||
NSDateComponents *components = [[NSDateComponents alloc] init];
|
||||
[components setMonth:months];
|
||||
NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
|
||||
return [calender dateByAddingComponents:components toDate:self options:0];
|
||||
}
|
||||
|
||||
#pragma mark - NSDate 转 NSString
|
||||
+ (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat {
|
||||
return [self br_stringFromDate:date dateFormat:dateFormat timeZone:nil language:nil];
|
||||
}
|
||||
#pragma mark - NSDate 转 NSString
|
||||
+ (NSString *)br_stringFromDate:(NSDate *)date
|
||||
dateFormat:(NSString *)dateFormat
|
||||
timeZone:(NSTimeZone *)timeZone
|
||||
language:(NSString *)language {
|
||||
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
|
||||
// 设置日期格式
|
||||
dateFormatter.dateFormat = dateFormat;
|
||||
// NSDateFormatter 设置时区 ,不设置默认为系统时区
|
||||
if (timeZone) {
|
||||
dateFormatter.timeZone = timeZone;
|
||||
}
|
||||
if (!language) {
|
||||
language = [NSLocale preferredLanguages].firstObject;
|
||||
}
|
||||
dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
|
||||
NSString *dateString = [dateFormatter stringFromDate:date];
|
||||
|
||||
return dateString;
|
||||
}
|
||||
|
||||
#pragma mark - NSString 转 NSDate
|
||||
+ (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat {
|
||||
return [self br_dateFromString:dateString dateFormat:dateFormat timeZone:nil language:nil];
|
||||
}
|
||||
#pragma mark - NSString 转 NSDate
|
||||
+ (NSDate *)br_dateFromString:(NSString *)dateString
|
||||
dateFormat:(NSString *)dateFormat
|
||||
timeZone:(NSTimeZone *)timeZone
|
||||
language:(NSString *)language {
|
||||
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
|
||||
// 设置日期格式
|
||||
dateFormatter.dateFormat = dateFormat;
|
||||
// 设置时区
|
||||
if (!timeZone) {
|
||||
timeZone = [self currentTimeZone];
|
||||
}
|
||||
if (!language) {
|
||||
language = [NSLocale preferredLanguages].firstObject;
|
||||
}
|
||||
dateFormatter.timeZone = timeZone;
|
||||
dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
|
||||
// 如果当前时间不存在,就获取距离最近的整点时间
|
||||
dateFormatter.lenient = YES;
|
||||
|
||||
return [dateFormatter dateFromString:dateString];
|
||||
}
|
||||
|
||||
#pragma mark - 获取当前时区(不使用夏时制)
|
||||
+ (NSTimeZone *)currentTimeZone {
|
||||
// 当前时区
|
||||
NSTimeZone *localTimeZone = [NSTimeZone localTimeZone];
|
||||
// 当前时区相对于GMT(零时区)的偏移秒数
|
||||
NSInteger interval = [localTimeZone secondsFromGMTForDate:[NSDate date]];
|
||||
// 当前时区(不使用夏时制):由偏移量获得对应的NSTimeZone对象
|
||||
// 注意:一些夏令时时间 NSString 转 NSDate 时,默认会导致 NSDateFormatter 格式化失败,返回 null
|
||||
return [NSTimeZone timeZoneForSecondsFromGMT:interval];
|
||||
}
|
||||
|
||||
#pragma mark - NSDate 转 NSString(已弃用)
|
||||
+ (NSString *)br_getDateString:(NSDate *)date format:(NSString *)format {
|
||||
return [self br_stringFromDate:date dateFormat:format];
|
||||
}
|
||||
|
||||
#pragma mark - NSString 转 NSDate(已弃用)
|
||||
+ (NSDate *)br_getDate:(NSString *)dateString format:(NSString *)format {
|
||||
return [self br_dateFromString:dateString dateFormat:format];
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user