码迷,mamicode.com
首页 > 其他好文 > 详细

UIdatePicker

时间:2015-05-20 18:25:49      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:ios   ios开发   

iOS学习之UIDatePicker控件使用

分类: iOS开发入门 20215人阅读 评论(1) 收藏 举报

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、实现代码

单击ViewController.m,找到刚才创建的

- (IBAction)selectDate:(id)sender {

}

在这里添加响应代码

  1. - (IBAction)selectDate:(id)sender {  
  2.     NSDate *select = [datePicker date];  
  3.     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
  4.     [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];  
  5.     NSString *dateAndTime =  [dateFormatter stringFromDate:select];  
  6.     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"时间提示" message:dateAndTime delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];  
  7.     [alert show];  
  8. }  
运行看效果:

技术分享


5、修改模式成Date模式,修改代码

  1. [dateFormatter setDateFormat:@"yyyy-MM-dd"];  

技术分享
/ 初始化UIDatePicker
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:UIControlEventValueChanged];
[self.view addSubview:datePicker];
[datePicker release];

// 获得当前UIPickerDate所在的时间
NSDate *selected = [datePicker date];

ios 开发中获得当前时间的 年月日,时分秒

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
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 = [NSCalendarcurrentCalendar];
    NSDateComponents*components;
    intunitFlags;
    floatsysVersion = [[[UIDevice currentDevice] systemVersion]floatValue];
    if(sysVersion >= 8.0) {
        unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth| NSCalendarUnitDay;
    }else{
        unitFlags = NSYearCalendarUnit| NSMonthCalendarUnit| NSDayCalendarUnit;
    }
    components = [calendar components:unitFlags
                             fromDate:date
                               toDate:[NSDatedate]
                              options:0];
     
    longyear = [components year];
    longmonth = [components month];
    longday = [components day];

计算时差:
?
1
2
3
4
5
6
7
8
9
10
11
    //设置源日期时区
    NSTimeZone* sourceTimeZone = [NSTimeZonetimeZoneWithAbbreviation:@"UTC"];//或GMT
    //设置转换后的目标日期时区
    NSTimeZone* destinationTimeZone = [NSTimeZonelocalTimeZone];
    //得到源日期与世界标准时间的偏移量
    NSIntegersourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:anyDate];
    //目标日期与本地时区的偏移量
    NSIntegerdestinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:anyDate];
    //得到时间偏移量的差值
    NSTimeIntervalinterval = 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 = [NSStringstringWithFormat:@"%ld", (long)[currentDate timeIntervalSince1970]];
    NSString*fromDay = [selfgetStringDateFormatterWithTimestamp:timestamp byFormat:@"dd"];
    NSString*toDay = [selfgetStringDateFormatterWithTimestamp:currentTimestamp byFormat:@"dd"];
     
    intfrom = [fromDay intValue];
    intto = [toDay intValue];
    
    returnto - from;


?
1
2
3
4
5
6
7
8
// 格式转换
+ (NSString*)getStringDateFormatterWithTimestamp:(NSString*)timestamp byFormat:(NSString*)format {
    NSDateFormatter*formatter = [[NSDateFormatteralloc] init];
    [formatter setDateFormat:[NSStringstringWithFormat:@"%@", format]];
    NSDate*date = [NSDatedateWithTimeIntervalSince1970:[timestamp doubleValue]];
    NSString*dateStr = [formatter stringFromDate:date];
    returndateStr;
}


4. 最后,无意间读别人的源代码,发现了swift的一句代
?
1
let isToday = calendar.isDateInToday(date)


于是我修改了自己的业务逻辑

?
1
2
3
4
5
6
7
8
9
10
    NSCalendar*calendar = [NSCalendarcurrentCalendar];
    BOOLisToday = [calendar isDateInToday:[NSDatedateWithTimeIntervalSince1970:[timestamp doubleValue]]];
    BOOLisYesterday = [calendar isDateInYesterday:[NSDatedateWithTimeIntervalSince1970:[timestamp doubleValue]]];    if(isToday) {
        return0;
    }
    if(isYesterday) {
        return1;
    }
    return-1;


UIdatePicker

标签:ios   ios开发   

原文地址:http://blog.csdn.net/longshiqing14/article/details/45873439

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!