2013-04-22 29 views
-1

我得到甚至當我把這個字符串有一個日期空日期如下圖所示的NSDate轉換的問題: -當輸入的NSDate格式是未知的,獨立的日期和時間

通用輸入日期格式爲「MM/DD/YYYY HH:MM一個」

的NSString輸入日期可以是下列之一: 「2012年12月1日」, 「2012年12月1日上午01時43分」, 「上午01時43分」

我想要的預期輸出是,如果輸入字符串中存在輸出字符串,則必須輸出日期,如果輸入字符串中存在時間,則必須輸出時間。

輸入: -

[self testDate:@"12/1/2012"] 

代碼: -

-(void) testDate:(NSString*) str{ 
    NSDateFormatter *formatter=[[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MM/dd/yyyy hh:mm a"];//My Generic Date Format 
    self.dateTest=[formatter dateFromString:str]; 
    [self printDate:self.dateTest]; 
} 


-(void) printSeparatedDateAndTime:(NSDate*) date{ 
    NSDateFormatter *dateF=[[NSDateFormatter alloc] init]; 
    [dateF setDateFormat:@"MM/dd/yyyy"]; 
    NSString *dateStr=[dateF stringFromDate:date]; 
    NSLog(@"Date= %@",dateStr); 

    [dateF setDateFormat:@"hh:mm a"]; 
    NSString *timeStr=[dateF stringFromDate:date]; 
    NSLog(@"Time= %@",timeStr); 
} 

輸出日期: -

日期=(空)

時間=(空)

輸入可以是任何格式,例如, X

輸入
「2012年12月1日」
輸出 日期= 「2012年12月1日」 時間=空

輸入 「2012年12月1日01:43 am「
output date =」12/1/2012「 time = 01:43 am

輸入 「上午01點43分」
輸出 日期=空 時間= 「上午01點43分」

人們可以得到不同的答案在這裏Objective-C String(yyyy-mm-dd) to NSDate。如果日期格式設置錯誤,這指的是答案。

在我的情況下日期格式是正確的。但它可能只有日期,只有時間或兩者。 要從字符串中分離日期和時間,可以參考ios4 - splitting a date and time from a string into two separate strings,但它沒有檢查答案或有效答案。

+0

in this [self printDate:date];什麼是約會? – Balu 2013-04-22 12:46:04

+0

如果您只發送日期,則不需要'hh:mm a',否則在日期字符串中發送時間。 – nsgulliver 2013-04-22 12:50:54

+0

在問題輸入字符串中編輯的@nsgulliver可以包含日期,時間或兩者。 – andyPaul 2013-04-24 16:50:45

回答

5

刪除hh:mm a和格式可以是 「MM/DD/YYYY」 或 「日/月/年」。

-(void) testDate:(NSString*) str{ 
    NSDateFormatter *formatter=[[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"dd/MM/yyyy"]; 
    self.dateTest=[formatter dateFromString:str]; 
    [self printDate:date]; 
} 

printeDate:如預期自創建之日起就沒有了時間的任何信息和你想顯示小時和minutes.It將始終顯示12.00將無法正常工作。

如果你想顯示小時和分鐘,你需要包括還您輸入的字符串。

編輯:由於的DateFormats可以在三種格式,你需要做一個試驗和錯誤。

-(void) testDate:(NSString*) str{ 

    NSArray *dateFormats = @[@"dd/MM/yyyy",@"hh:mm a",@"dd/MM/yyyy hh:mm a"]; 

    NSDateFormatter *formatter=[[NSDateFormatter alloc] init]; 
    NSDate *date = nil; 

    for (NSString *dateFormat in dateFormats) { 
     [formatter setDateFormat:dateFormat]; 
     date = [formatter dateFromString:str]; 
     if (date) { 
      break; 
     } 
    } 

    [self printDate:date]; 
} 

OR

-(void) testDate:(NSString*) dateString 
{ 
    NSDate *date = nil; 
    NSError *error = nil; 
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate 
                   error:&error]; 
    NSArray *matches = [detector matchesInString:dateString 
             options:0 
              range:NSMakeRange(0, [dateString length])]; 
    for (NSTextCheckingResult *match in matches) { 
     if (match.date) { 
      date = match.date; 
      break; 
     } 
    } 

    [self printDate:date]; 
} 

編輯2:由於它是一個要求有數據/時間爲nil出來。請嘗試

typedef enum { 
    ValidDateType = 0, 
    ValidTimeType = 1, 
    ValidDateTimeType =2 
}ValidType; 

- (void)testDate:(NSString*) dateString 
{ 
    NSArray *dateFormats = @[@"dd/MM/yyyy",@"hh:mm a",@"dd/MM/yyyy hh:mm a"]; 

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

    __block NSDate *date = nil; 
    __block ValidType type = ValidDateType; 

    [dateFormats enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     NSString *dateFormat = (NSString *)obj; 
     [formatter setDateFormat:dateFormat]; 
     date = [formatter dateFromString:dateString]; 
     if (date) { 
      type = idx; 
      *stop = TRUE; 
     } 

    }]; 

    [self printDate:date validType:type]; 
} 

- (void)printDate:(NSDate*) date validType:(ValidType)type 
{ 
    NSDateFormatter *dateF=[[NSDateFormatter alloc] init]; 
    [dateF setDateFormat:@"MM/dd/yyyy"]; 
    NSString *dateStr=[dateF stringFromDate:date]; 


    [dateF setDateFormat:@"hh:mm a"]; 
    NSString *timeStr=[dateF stringFromDate:date]; 

    dateStr = (type == ValidTimeType)?nil:dateStr; 
    timeStr = (type == ValidDateType)?nil:timeStr; 

    NSLog(@"Time= %@",timeStr); 
    NSLog(@"Date= %@",dateStr); 

} 
+0

是的你是對的,但通過各種格式循環!比這更好的東西。 – andyPaul 2013-04-22 13:16:35

+0

@andyPaul我編輯了我的答案。如果輸入的dateString在一個已知的時區,那麼dateDetector會正常工作。 – Anupdas 2013-04-22 13:18:26

+0

這是一個很好的答案。但如果只有時間存在,則日期必須爲空。如果只有日期存在,那麼時間必須爲空。如果兩者都存在okie,則輸出它們。 – andyPaul 2013-04-22 13:23:20

1

您將日期格式設置爲包含時間:MM/dd/yyyy hh:mm a,但您不會隨時隨地與您通過字符串:12/1/2012

剛剛從日期格式刪除hh:mm a

-(void) testDate:(NSString*) str{ 
    NSDateFormatter *formatter=[[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MM/dd/yyyy"]; 
    self.dateTest = [formatter dateFromString:str]; 
    [self printDate:self.dateTest]; 
} 

而且我也不會使用靜態的日期格式建議,只是櫃面你有任何非美國用戶。 Apple已添加NSDateFormatterStyle以便您輕鬆使用用戶/系統選擇的格式化風格。

-(void) printDate:(NSDate*) date{ 
    NSDateFormatter *dateF=[[NSDateFormatter alloc] init]; 
    dateF.dateStyle = NSDateFormatterMediumStyle; 
    dateF.timeStyle = NSDateFormatterNoStyle; 
    NSString *dateStr=[dateF stringFromDate:date]; 
    NSLog(@"Date= %@",dateStr); 

    dateF.dateStyle = NSDateFormatterNoStyle; 
    dateF.timeStyle = NSDateFormatterShortStyle; 
    NSString *timeStr=[dateF stringFromDate:date]; 
    NSLog(@"Time= %@",timeStr); 
} 
相關問題