-1

即使我传递的字符串具有如下所示的日期,我也会得到空日期:-

通用输入日期格式为“MM/dd/YYYY hh:mm a”

NSString 输入日期可以是以下之一:“12/1/2012”、“12/1/2012 01:43 am”、“01:43 am”

我正在尝试的预期输出是,如果输入字符串中存在日期,则必须打印日期,如果输入字符串中存在时间,则必须打印时间。

输入:-

 [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);
}

输出日期:-

日期=(空)

时间=(空)

输入可以是任何格式,例如

输入
“12/1/2012”
输出 日期=“12/1/2012”时间=空

输入 "12/1/2012 01:43 am"
输出 日期="12/1/2012" 时间=01:43 am

输入 “01:43 am”
输出 日期=空时间=“01:43 am”

在这里Objective-C String(yyyy-mm-dd) 到 NSDate可以得到不同的答案。这是指日期格式设置错误时的回答。

在我的情况下,日期格式是正确的。但它可能只有日期、时间或两者都有。要从字符串中分离日期和时间,可以参考此处ios4 - 将日期和时间从字符串拆分为两个单独的字符串,但它没有经过检查的答案或有效答案。

4

2 回答 2

5

删除hh:mm a ,格式可以是“MM/dd/yyyy”或“dd/MM/yyyy”。

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

printeDate:将无法按预期工作,因为创建的日期没有关于时间的任何信息,并且您正在尝试显示小时和分钟。它将始终显示 12.00 AM。

如果您想显示小时和分钟,您还需要在输入字符串中包含它。

编辑:由于 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];
}

或者

-(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:因为要求数据/时间为零。请试试

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);

}
于 2013-04-22T12:47:45.257 回答
1

您将日期格式设置为包括 time: MM/dd/yyyy hh:mm a,但您没有通过 string: 传递任何时间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);
}
于 2013-04-22T12:46:26.970 回答