[iOS]选择开始时间和结束时间
demo:https://download.****.net/download/u012881779/10930215
使用了PGDatePicker进行时间选择
使用了JGProgressHUD进行文本提示
这里的情况是分段选择时间,若单次选择开始和结束时间也可以用类似方式限制结束时间的选择。
原型设计了这种:
实现比较简单,放上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,故可选择的“结束时间年月日”会大于“开始时间的年月日”。
选择结束时间的“时分秒”。因为设置了minimumDate,若“结束时间的年月日”选择和“开始时间的年月日”一致,则选择“时分秒”时只能选择大于“开始时间的时分秒”的时间。