[iOS]选择开始时间和结束时间

demo:https://download.****.net/download/u012881779/10930215
使用了PGDatePicker进行时间选择
使用了JGProgressHUD进行文本提示
这里的情况是分段选择时间,若单次选择开始和结束时间也可以用类似方式限制结束时间的选择。

原型设计了这种:
[iOS]选择开始时间和结束时间
实现比较简单,放上code就好了。

#import "GASelectTimeViewController.h"
#import "PGDatePicker.h"
#import "JGProgressHUD.h"

@interface GASelectTimeViewController () <PGDatePickerDelegate>

@property (weak, nonatomic) IBOutlet UITextField *startYMDText; // 开始时间:年月日
@property (weak, nonatomic) IBOutlet UITextField *startHMSText; // 开始时间:时分秒
@property (weak, nonatomic) IBOutlet UITextField *endYMDText;   // 结束时间:年月日
@property (weak, nonatomic) IBOutlet UITextField *endHMSText;   // 结束时间:时分秒
@property (weak, nonatomic) IBOutlet UIButton *saveBut;         // 保存按钮
@property (strong, nonatomic) PGDatePicker *datePicker;

@end

@implementation GASelectTimeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"拼团产品设置";
    [self addRightImgInTextField:_startYMDText];
    [self addRightImgInTextField:_startHMSText];
    [self addRightImgInTextField:_endYMDText];
    [self addRightImgInTextField:_endHMSText];
    
    _startYMDText.text = [self getNowTimeWithMark:0];
    _startHMSText.text = [self getNowTimeWithMark:1];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:NO];
    [self.navigationController.navigationBar setTranslucent:NO];
    // 设置导航栏背景图片
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    // 移除导航栏分割线
    // [self.navigationController.navigationBar setShadowImage:[UIImage new]];
}

// UITextField点击右侧图标
- (void)addRightImgInTextField:(UITextField *)textField {
    UIImageView *imageView = [UIImageView new];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.image = [UIImage imageNamed:@"pt-you"];
    imageView.frame = CGRectMake(0, 0, 7+10, 14);
    
    textField.rightView = imageView;
    textField.rightViewMode = UITextFieldViewModeAlways;
}

// 获取当前 0:年月日|1:时分秒
- (NSString *)getNowTimeWithMark:(NSInteger)mark {
    NSDateComponents *dateComponents = [self getDateComponentsWithDate:[NSDate date]];
    if (mark == 0) {
        NSString *ymdStr = [NSString stringWithFormat:@"%04ld-%02ld-%02ld",(long)dateComponents.year,(long)dateComponents.month,(long)dateComponents.day];
        return ymdStr;
    } else if (mark == 1) {
        NSString *hmsStr = [NSString stringWithFormat:@"%02ld:%02ld:%02ld",(long)dateComponents.hour,(long)dateComponents.minute,(long)dateComponents.second];
        return hmsStr;
    }
    return @"";
}

// 点击选择时间|分类
- (IBAction)tapSelectDataAction:(UITapGestureRecognizer *)sender {
    NSInteger tag = sender.view.tag;
    if (tag == 3000) {        // 开始时间:年月日
        [self selectTimeWithMark:100];
    } else if (tag == 3001) { // 开始时间:时分秒
        [self selectTimeWithMark:101];
    } else if (tag == 3010) { // 结束时间:年月日
        [self selectTimeWithMark:102];
    } else if (tag == 3011) { // 结束时间:时分秒
        [self selectTimeWithMark:103];
    }
}

// 点击保存按钮
- (IBAction)tapSaveButtonAction:(id)sender {
    if ([self judgeStringIsNull:_startYMDText.text] && [self judgeStringIsNull:_startHMSText.text]) {
        if ([self judgeStringIsNull:_endYMDText.text] && [self judgeStringIsNull:_endHMSText.text]) {
            
            NSArray *a = [_startYMDText.text componentsSeparatedByString:@"-"];
            NSString *aa = [a componentsJoinedByString:@""];
            NSArray *b = [_startHMSText.text componentsSeparatedByString:@":"];
            NSString *bb = [b componentsJoinedByString:@""];
            NSString *cc = [NSString stringWithFormat:@"%@%@",aa,bb];
            NSArray *d = [_endYMDText.text componentsSeparatedByString:@"-"];
            NSString *dd = [d componentsJoinedByString:@""];
            NSArray *e = [_endHMSText.text componentsSeparatedByString:@":"];
            NSString *ee = [e componentsJoinedByString:@""];
            NSString *ff = [NSString stringWithFormat:@"%@%@",dd,ee];
            
            if ([cc longLongValue] <= [ff longLongValue]) {
                
            } else {
                [JGProgressHUD showWithStr:@"选择的拼团开始时间小于结束时间" WithTime:1];
            }
        } else {
            [JGProgressHUD showWithStr:@"请选择拼团结束时间" WithTime:1];
        }
    } else {
        [JGProgressHUD showWithStr:@"请选择拼团开始时间" WithTime:1];
    }
}

#pragma mark - 日期选择
// 选择时间 100:开始时间年月日 101:开始时间时分秒 102:结束时间年月日 103:结束时间时分秒
- (void)selectTimeWithMark:(NSInteger)mark {
    _datePicker = nil;
    _datePicker = [PGDatePicker new];
    _datePicker.tag = mark;
    _datePicker.delegate = self;
    
    if (mark == 100) {
        _datePicker.minimumDate = [NSDate date];
        _datePicker.datePickerMode = PGDatePickerModeDate;
    } else if (mark == 101) {
        NSString *nowYMDStr = [self getNowTimeWithMark:0];
        if ([_startYMDText.text isEqualToString:nowYMDStr]) {
            _datePicker.minimumDate = [NSDate date];
        }
        _datePicker.datePickerMode = PGDatePickerModeTimeAndSecond;
    } else if (mark == 102) {
        NSString *tempStartTime = [NSString stringWithFormat:@"%@ %@",_startYMDText.text,_startHMSText.text];
        NSDate *tempStartDate = [self conversionDateWithTime:tempStartTime];
        if (!tempStartDate) {
            tempStartDate = [NSDate date];
        }
        _datePicker.minimumDate = tempStartDate;
        _datePicker.datePickerMode = PGDatePickerModeDate;
    } else if (mark == 103) {
        NSString *nowYMDStr = _startYMDText.text;
        if ([_endYMDText.text isEqualToString:nowYMDStr]) {
            NSString *tempStartTime = [NSString stringWithFormat:@"%@ %@",_startYMDText.text,_startHMSText.text];
            NSDate *tempStartDate = [self conversionDateWithTime:tempStartTime];
            if (!tempStartDate) {
                tempStartDate = [NSDate date];
            }
            _datePicker.minimumDate = tempStartDate;
        }
        _datePicker.datePickerMode = PGDatePickerModeTimeAndSecond;
    }
    
    [_datePicker show];
}

#pragma mark - PGDatePickerDelegate

- (void)datePicker:(PGDatePicker *)datePicker didSelectDate:(NSDateComponents *)dateComponents {
    NSString *ymdStr = [NSString stringWithFormat:@"%04ld-%02ld-%02ld",(long)dateComponents.year,(long)dateComponents.month,(long)dateComponents.day];
    NSString *hmsStr = [NSString stringWithFormat:@"%02ld:%02ld:%02ld",(long)dateComponents.hour,(long)dateComponents.minute,(long)dateComponents.second];
    NSInteger tag = datePicker.tag;
    if (tag == 100) {
        _startYMDText.text = ymdStr;
    } else if (tag == 101) {
        _startHMSText.text = hmsStr;
    } else if (tag == 102) {
        _endYMDText.text = ymdStr;
    } else if (tag == 103) {
        _endHMSText.text = hmsStr;
    }
}

#pragma mark - 方法

// 获得日期组件 [NSDate date]
- (NSDateComponents *)getDateComponentsWithDate:(NSDate *)theDate {
    NSDate *nowDate = theDate;
    NSCalendar *cal = [NSCalendar currentCalendar];
    [cal setFirstWeekday:2];
    NSDateComponents *components = [cal components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond|NSCalendarUnitWeekday|NSCalendarUnitWeekOfYear fromDate:nowDate];
    return components;
}

// 转换字符串时间为NSDate @"1986-03-28 00:00:00"
- (NSDate *)conversionDateWithTime:(NSString *)theTime {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    // [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *tempDate = [dateFormatter dateFromString:theTime];
    return tempDate;
}

// 判断字符串是否不全为空
- (BOOL)judgeStringIsNull:(NSString *)string {
    if (![[string class] isSubclassOfClass:[NSString class]]) {
        return NO;
    }
    if ([[string class] isSubclassOfClass:[NSNumber class]]) {
        return YES;
    }
    BOOL result = NO;
    if (string != nil && string.length > 0) {
        for (int i = 0; i < string.length; i ++) {
            NSString *subStr = [string substringWithRange:NSMakeRange(i, 1)];
            if (![subStr isEqualToString:@" "] && ![subStr isEqualToString:@""]) {
                result = YES;
            }
        }
    }
    return result;
}

@end

示意图:
选择结束时间的“年与日”。因为设置了minimumDate,故可选择的“结束时间年月日”会大于“开始时间的年月日”。
[iOS]选择开始时间和结束时间

选择结束时间的“时分秒”。因为设置了minimumDate,若“结束时间的年月日”选择和“开始时间的年月日”一致,则选择“时分秒”时只能选择大于“开始时间的时分秒”的时间。
[iOS]选择开始时间和结束时间