天天看點

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 試試看,打造一個你自己的專用滾輪。

繼續閱讀