天天看点

NSDate使用,NSDateFormatter转换,及DatePicker

取当前时间的秒数

NSTimeInterval time = [[NSDate date] timeIntervalSince1970];

long long int date = (long long int)time;

NSLog(@”date\n%d”, date); //1295322949

//把秒数转化成yyyy-MM-dd hh:mm:ss格式

NSDate *dd = [NSDate dateWithTimeIntervalSince1970:date];

NSLog(@”d:%@”,dd); //2011-01-18 03:55:49 +0000

//给一个时间秒数,取出对应的时间

NSString *s = @”1295355600000″; //对应21:00

NSDate *d = [NSDate dateWithTimeIntervalSince1970:[s doubleValue]/1000];

NSLog(@”dddd:%@”,d); //2011-01-18 13:00:00 +0000

NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];

[formatter1 setDateFormat:@"HH:mm"];

NSString *showtimeNew = [formatter1 stringFromDate:d];

NSLog(@”showtimeNew:%@”,showtimeNew); //21:00 比d的时间 +8小时

[formatter1 release];

1. 创建或初始化可用以下方法

用于创建NSDate实例的类方法有

+ (id)date;

返回当前时间

+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;

返回以当前时间为基准,然后过了secs秒的时间

+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs;

返回以2001/01/01 GMT为基准,然后过了secs秒的时间

+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;

返回以1970/01/01 GMT为基准,然后过了secs秒的时间

+ (id)distantFuture;

返回很多年以后的未来的某一天。(比如你需要一个比现在(Now)晚(大)很长时间的时间值,则可以调用该方法。测试返回了4000/12/31 16:00:00)

+ (id)distantPast;

返回很多年以前的某一天。(比如你需要一个比现在(Now)早(小)大很长时间的时间值,则可以调用该方法。测试返回了公元前0001/12/31 17:00:00)

用于创建NSDate实例的实例方法有

- (id)addTimeInterval:(NSTimeInterval)secs;

返回以目前的实例中保存的时间为基准,然后过了secs秒的时间

用于初始化NSDate实例的实例方法有

- (id)init;

初始化为当前时间。类似date方法

初始化为以2001/01/01 GMT为基准,然后过了secs秒的时间。类似dateWithTimeIntervalSinceReferenceDate:方法

- (id)initWithTimeInterval:(NSTimeInterval)secs sinceDate:(NSDate *)refDate;

初始化为以refDate为基准,然后过了secs秒的时间

- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;

初始化为以当前时间为基准,然后过了secs秒的时间

2. 日期之间比较可用以下方法

- (BOOL)isEqualToDate:(NSDate *)otherDate;

与otherDate比较,相同返回YES

- (NSDate *)earlierDate:(NSDate *)anotherDate;

与anotherDate比较,返回较早的那个日期

- (NSDate *)laterDate:(NSDate *)anotherDate;

与anotherDate比较,返回较晚的那个日期

- (NSComparisonResult)compare:(NSDate *)other;

该方法用于排序时调用:

. 当实例保存的日期值与anotherDate相同时返回NSOrderedSame

. 当实例保存的日期值晚于anotherDate时返回NSOrderedDescending

. 当实例保存的日期值早于anotherDate时返回NSOrderedAscending

3. 取回时间间隔可用以下方法

- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)refDate;

以refDate为基准时间,返回实例保存的时间与refDate的时间间隔

- (NSTimeInterval)timeIntervalSinceNow;

以当前时间(Now)为基准时间,返回实例保存的时间与当前时间(Now)的时间间隔

- (NSTimeInterval)timeIntervalSince1970;

以1970/01/01 GMT为基准时间,返回实例保存的时间与1970/01/01 GMT的时间间隔

- (NSTimeInterval)timeIntervalSinceReferenceDate;

以2001/01/01 GMT为基准时间,返回实例保存的时间与2001/01/01 GMT的时间间隔

+ (NSTimeInterval)timeIntervalSinceReferenceDate;

以2001/01/01 GMT为基准时间,返回当前时间(Now)与2001/01/01 GMT的时间间隔

4. 将时间表示成字符串

- (NSString *)description;

以YYYY-MM-DD HH:MM:SS ±HHMM的格式表示时间。(其中 “±HHMM” 表示与GMT的存在多少小时多少分钟的时区差异。比如,若时区设置在北京,则 “±HHMM” 显示为 “+0800″)

使用NSDateFormatter转换时间字符串时,默认的时区是系统时区,如我们使用一般都是北京时间(+8),

如果直接使用

[cpp]  view plain  copy  print ?

  1. [dateFormatter dateFromString:@"2012-01-01 00:00:00"];  

你会发现实际转换为2011-12-31 16:00:00,少了8小时

所以我们要先指定时区为GMT再转换,如下:

[cpp]  view plain  copy  print ?

  1. static NSString *GLOBAL_TIMEFORMAT = @"yyyy-MM-dd HH:mm:ss";  
  2. static NSString *GLOBAL_TIMEBASE = @"2012-01-01 00:00:00";  
  3.     NSTimeZone* localzone = [NSTimeZone localTimeZone];  
  4.     NSTimeZone* GTMzone = [NSTimeZone timeZoneForSecondsFromGMT:0];  
  5.     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
  6.     [dateFormatter setDateFormat:GLOBAL_TIMEFORMAT];  
  7.     [dateFormatter setTimeZone:GTMzone];  
  8.     NSDate *bdate = [dateFormatter dateFromString:GLOBAL_TIMEBASE];  
  9.     NSDate *day = [NSDate dateWithTimeInterval:3600 sinceDate:bdate];  
  10.     [dateFormatter setTimeZone:localzone];  
  11.     NSLog(@"CurrentTime = %@", [dateFormatter stringFromDate:day]);  

还可以如下:

[cpp]  view plain  copy  print ?

  1. NSTimeZone* localzone = [NSTimeZone localTimeZone];  
  2. NSTimeZone* GTMzone = [NSTimeZone timeZoneForSecondsFromGMT:0];  
  3. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
  4. [dateFormatter setDateFormat:GLOBAL_TIMEFORMAT];  
  5. [dateFormatter setTimeZone:GTMzone];  
  6. NSDate *bdate = [dateFormatter dateFromString:GLOBAL_TIMEBASE];  
  7. NSDate *day = [NSDate dateWithTimeInterval:(3600 + [localzone secondsFromGMT]) sinceDate:bdate];  
  8. NSString *text = [dateFormatter stringFromDate:day];  

UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期、时间和持续时长的输入。日期选取器的各列会按照指定的风格进行自动配置,这样就让开发者不必关心如何配置表盘这样的底层操作。你也可以对其进行定制,令其使用任何范围的日期。

UIDatePicker 依赖于 NSDate 类,这个类是cocoa 基础的一员,以前用于桌面系统。本文中仅需用到 initWithString 来创建NSDate 所以NSDate 留待专题讲解,你只需要掌握本文中使用的方法就好。

[java]  view plain  copy  print ?

  1. NSDate* _date = [ [ NSDate alloc] initWithString:@"2012-03-07 00:35:00 -0500"];  

一、创建日期/时间选取器

UIDatePicker 使用起来比标准 UIPickerView 更简单。他会根据你指定的日期范围创建自己的数据源。使用它只需要创建一个对象:

[java]  view plain  copy  print ?

  1. UIDatePicker *datePicker = [ [ UIDatePicker alloc] initWithFrame:CGRectMake(0.0,0.0,0.0,0.0)];  

默认情况下选取会显示目前的日期和时间,并提供几个表盘,分别显示可以选择的月份和日期、小时、分钟、以及上午、下午。因此用户默认可以选择任何日期和时间的组合。

二、日期选取器模式

日期/时间选取器支持4种不同模式的选择方式。通过设置 datePickerMode 属性,可以定义选择模式:

[java]  view plain  copy  print ?

  1. datePicker.datePickerMode = UIDatePickerModeTime;  

支持的模式:

[java]  view plain  copy  print ?

  1. typedef enum {  
  2.     UIDatePickerModeTime,           // Displays hour, minute, and optionally AM/PM designation depending on the locale setting (e.g. 6 | 53 | PM)  
  3.     UIDatePickerModeDate,           // Displays month, day, and year depending on the locale setting (e.g. November | 15 | 2007)  
  4.     UIDatePickerModeDateAndTime,    // Displays date, hour, minute, and optionally AM/PM designation depending on the locale setting (e.g. Wed Nov 15 | 6 | 53 | PM)  
  5.     UIDatePickerModeCountDownTimer  // Displays hour and minute (e.g. 1 | 53)  
  6. } UIDatePickerMode;  

三、时间间隔

你可以将分钟表盘设置为以不同的时间间隔来显示分钟,前提是该间隔要能够让60整除。默认间隔是一分钟。如果要使用不同的间隔,需要改变 minuteInterval属性:

[java]  view plain  copy  print ?

  1. datePicker.minuteInterval = 5;  

四、日期范围

你可以通过设置mininumDate 和 maxinumDate 属性,来指定使用的日期范围。如果用户试图滚动到超出这一范围的日期,表盘会回滚到最近的有效日期。两个方法都需要NSDate 对象作参数:

[java]  view plain  copy  print ?

  1. NSDate* minDate = [[NSDate alloc]initWithString:@"1900-01-01 00:00:00 -0500"];  
  2.     NSDate* maxDate = [[NSDate alloc]initWithString:@"2099-01-01 00:00:00 -0500"];  
  3.     datePicker.minimumDate = minDate;  
  4.     datePicker.maximumDate = maxDate;  

如果两个日期范围属性中任何一个未被设置,则默认行为将会允许用户选择过去或未来的任意日期。这在某些情况下很有用处,比如,当选择生日时,可以是过去的任意日期,但终止与当前日期。如果你希望设置默认显示的日期,可以使用date属性: [java]  view plain  copy  print ?

  1. datePicker.date = minDate;  

此外,你还可以用 setDate 方法。如果选择了使用动画,则表盘会滚动到你指定的日期: [java]  view plain  copy  print ?

  1. [ datePicker setDate:maxDate animated:YES];  

五、显示日期选择器

[java]  view plain  copy  print ?

  1. [ self.view addSubview:datePicker];  

需要注意的是,选取器的高度始终是216像素,要确定分配了足够的空间来容纳。

六、读取日期

[java]  view plain  copy  print ?

  1. NSDate* _date = datePicker.date;  

由于日期选择器是 UIControl的子类 (与UIPickerView不同),你还可以在UIControl类的通知结构中挂接一个委托: [java]  view plain  copy  print ?

  1. [ datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged ];  

只要用户选择了一个新日期,你的动作类就会被调用: [java]  view plain  copy  print ?

  1. -(void)dateChanged:(id)sender{  
  2.           UIDatepicker* control = (UIDatePicker*)sender;  
  3. NSDate* _date = control.date;  
  4. }  

是不是觉得很好玩呢?确实。如果觉得好玩,你也试着封装一个UIPickerView 试试看,打造一个你自己的专用滚轮。