UIdatePicker

本文详细介绍了如何在iOS应用中使用UIDatePicker控件进行时间日期的选择与显示,包括创建控件、关联界面与代码实现,以及通过不同模式(Time, Date, DateandTime, CountDownTimer)灵活展示时间日期信息。同时,文章还探讨了如何在iOS中解决日期时间本地化时区问题,并提供了实用的日期时间计算与格式化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 {

}

在这里添加响应代码

[cpp]  view plain copy
  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模式,修改代码

[cpp]  view plain copy
  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;

NSDate使用大全,个人整理的


#define kDEFAULT_DATE_TIME_FORMAT (@"yyyy-MM-dd HH:mm:ss")

//获取当前日期,时间
+(NSDate *)getCurrentDate{
    NSDate *now = [NSDate date];
    return now;
}



//将日期转换为字符串(日期,时间)
+(NSString *)getDateStringFromDate:(NSDate *)date{
    NSInteger location = 0;
    NSString *timeStr = @"";
    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
    [formatter setDateFormat:@"HH:mm:a"];
    NSString *ampm = [[[formatter stringFromDate:date] componentsSeparatedByString:@":"] objectAtIndex:2];
    timeStr = [formatter stringFromDate:date];
    NSRange range = [timeStr rangeOfString:[NSString stringWithFormat:@":%@",ampm]];
    location = range.location;
    NSString *string = [timeStr substringToIndex:location];
    timeStr = [NSString stringWithFormat:@"%@ %@",ampm,string];
    
    
    NSString *dateStr = @"";
    NSDateFormatter *Dformatter = [[[NSDateFormatter alloc] init] autorelease];
    [Dformatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
    [Dformatter setDateFormat:@"yyyy-MM-dd"];    
    dateStr = [Dformatter stringFromDate:date];
//    NSLog(@"%@", [NSString stringWithFormat:@"%@  %@",dateStr,timeStr]);
    return [NSString stringWithFormat:@"%@  %@",dateStr,timeStr];
}




//计算两个日期之间的差距,过了多少天。。
+(NSInteger)getDateToDateDays:(NSDate *)date withSaveDate:(NSDate *)saveDate{
    NSCalendar* chineseClendar = [ [ NSCalendar alloc ] initWithCalendarIdentifier:NSGregorianCalendar ];  
    NSUInteger unitFlags =  NSHourCalendarUnit | NSMinuteCalendarUnit |   
    NSSecondCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;  
    NSDateComponents *cps = [ chineseClendar components:unitFlags fromDate:date  toDate:saveDate  options:0];  
    NSInteger diffDay   = [ cps day ];  
    [chineseClendar release]; 
    return diffDay;
}


例:NSDate *lastDate = [self getSaveDate];//saveDate通过将NSDate转换为NSString来保存
    currentDate = [NSDate date];
    NSInteger day = [DateHelper getDateToDateDays:currentDate withSaveDate: lastDate];





//日期转字符串
+ (NSString * )NSDateToNSString: (NSDate * )date
{    
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat: kDEFAULT_DATE_TIME_FORMAT];
    NSString *dateString = [formatter stringFromDate:date];
    [formatter release];
    return dateString;
}


//字符串转日期
+ (NSDate * )NSStringToNSDate: (NSString * )string
{    
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat: kDEFAULT_DATE_TIME_FORMAT];
    NSDate *date = [formatter dateFromString :string];
    [formatter release];
    return date;
}




//1970年到现在的秒数转换成时间显示

- (NSString *)bySecondGetDate:(NSString *)second{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
    NSString *dateLoca = [NSString stringWithFormat:@"%@",second];
    NSTimeInterval time=[dateLoca doubleValue];
    NSDate *detaildate=[NSDate dateWithTimeIntervalSince1970:time];
    NSString *timestr = [formatter stringFromDate:detaildate];
    return timestr;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值