iOS上的选择时间日期的控件是这样的,左边是时间和日期混合,右边是单纯的日期模式。
,
您可以选择自己需要的模式,Time, Date,Date and Time , Count Down Timer四种模式。
本篇文章简单介绍下PickerDate控件的使用
1、新建一个Singe View Application,命名为DatePickDemo,其他设置如图
2、放置控件
打开ViewController.xib,拖拽一个DatePicker控件放到界面上,再拖拽一个Button控件放到界面上,双击Button,输入"选择日期时间"
3、建立xib和ViewController的关联
按下command+alt+enter键打开Assistant Editor,选中DatePicker按住Control键,拖拽到viewController.h上,
建立Outlet datePicker。
以同样方式给Button建立一个Action关联映射,命名为selectDate,事件类型为默认的Touch Up Inside。
4、实现代码
- (IBAction)selectDate:(id)sender {
}
在这里添加响应代码
- - (IBAction)selectDate:(id)sender {
- NSDate *select = [datePicker date];
- NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
- [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];
- NSString *dateAndTime = [dateFormatter stringFromDate:select];
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"时间提示" message:dateAndTime delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
- [alert show];
- }
5、修改模式成Date模式,修改代码
- [dateFormatter setDateFormat:@"yyyy-MM-dd"];

UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 200, 320, 216)];
// 设置时区
[datePicker setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
// 设置当前显示时间
[datePicker setDate:tempDate animated:YES];
// 设置显示最大时间(此处为当前时间)
[datePicker setMaximumDate:[NSDate date]];
// 设置UIDatePicker的显示模式
[datePicker setDatePickerMode:UIDatePickerModeDate];
// 当值发生改变的时候调用的方法
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChang
[self.view addSubview:datePicker];
[datePicker release];
// 获得当前UIPickerDate所在的时间
NSDate *selected = [datePicker date];
NSDate *now;
NSDateComponents *comps = [[NSDateComponents alloc] init];
NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit |
NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
now=[NSDate date];
comps = [calendar components:unitFlags fromDate:now];
week = [comps weekday];
month = [comps month];
day = [comps day];
hour = [comps hour];
min = [comps minute];
sec = [comps second];
//Week:
1 --星期天
2--星期一
3--星期二
4--星期三
5--星期四
6--星期五
7--星期六
第一时间想到使用NSDateComponents,但无论我怎么转换时区,返回的天数差距总是不对,打印查看一下发现,差了8小时,也就是时区设置无效?
考虑到国际化,肯定不能将8小时直接在程序里做计算,目前的解决方案考虑首先计算时间偏移量(时差),然后将NSDateComponents返回结果与时差在重新计算一次,不知是否可行。
贴一些关键代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
NSCalendar *calendar = [ NSCalendar currentCalendar];
NSDateComponents *components;
int unitFlags;
float sysVersion = [[[UIDevice currentDevice] systemVersion]floatValue];
if (sysVersion >= 8.0) {
unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay ;
} else {
unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit ;
}
components = [calendar components:unitFlags
fromDate:date
toDate:[ NSDate date]
options:0];
long year = [components year];
long month = [components month];
long day = [components day];
|
计算时差:
1
2
3
4
5
6
7
8
9
10
11
|
//设置源日期时区
NSTimeZone * sourceTimeZone = [ NSTimeZone timeZoneWithAbbreviation:@ "UTC" ]; //或GMT
//设置转换后的目标日期时区
NSTimeZone * destinationTimeZone = [ NSTimeZone localTimeZone];
//得到源日期与世界标准时间的偏移量
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:anyDate];
//目标日期与本地时区的偏移量
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:anyDate];
//得到时间偏移量的差值
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
NSLog (@ "%f" , interval/60/60); // 8.000000
|
目前找到了一个更加简单的办法来实现。
总结一下:
1. NSDateComponents无法计算时区,无论之前对fromDate和toDate怎么转换都是无效的。比如:北京时间2015-2-3 11:00:00 和2015-2-4 01:00:00比较,返回的日期差不会是1。打印一下,NSDateComponents比较的时间被转换成了2015-2-3 03:00:00 +0000 和2015-2-3 17:00:00 +0000
2. qianshijia 同学提出的意见,我没有采纳,本人也是初学OC,对于获取今日0时的方法,也只是想到用NSDateComponents。同样,比如我想获取2015-2-4 00:00:00。但是结果却返回了2015-2-3 16:00:00 +0000。
3. 下午找了一个不是办法的办法,设置NSDateFormatter,格式为@"dd"。NSDateFormatter似乎会自动帮我们做好本地化。这个我不确定,总之我之前使用NSDateFormatter从没遇到过时差的问题。
1
2
3
4
5
6
7
8
9
|
// 计算日期差
NSString *currentTimestamp = [ NSString stringWithFormat:@ "%ld" , ( long )[currentDate timeIntervalSince1970]];
NSString *fromDay = [ self getStringDateFormatterWithTimestamp:timestamp byFormat:@ "dd" ];
NSString *toDay = [ self getStringDateFormatterWithTimestamp:currentTimestamp byFormat:@ "dd" ];
int from = [fromDay intValue];
int to = [toDay intValue];
return to - from;
|
1
2
3
4
5
6
7
8
|
// 格式转换
+ ( NSString *)getStringDateFormatterWithTimestamp:( NSString *)timestamp byFormat:( NSString *)format {
NSDateFormatter *formatter = [[ NSDateFormatter alloc] init];
[formatter setDateFormat:[ NSString stringWithFormat:@ "%@" , format]];
NSDate *date = [ NSDate dateWithTimeIntervalSince1970:[timestamp doubleValue]];
NSString *dateStr = [formatter stringFromDate:date];
return dateStr;
}
|
4. 最后,无意间读别人的源代码,发现了swift的一句代
1
|
let isToday = calendar.isDateInToday(date)
|
于是我修改了自己的业务逻辑
1
2
3
4
5
6
7
8
9
10
|
NSCalendar *calendar = [ NSCalendar currentCalendar];
BOOL isToday = [calendar isDateInToday:[ NSDate dateWithTimeIntervalSince1970:[timestamp doubleValue]]];
BOOL isYesterday = [calendar isDateInYesterday:[ NSDate dateWithTimeIntervalSince1970:[timestamp doubleValue]]]; if (isToday) {
return 0;
}
if (isYesterday) {
return 1;
}
return -1;
NSDate使用大全,个人整理的
|