2013-04-22 32 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); 
} 
相关问题