输入NSDate格式未知且单独的日期和时间时NSDate转换问题

NNi*_*ikN -1 objective-c nsdate nsdateformatter ios

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

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

NSString输入日期可以是以下之一:"12/1/2012","12/1/2012 01:43 am","01:43 am"

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

输入: -

 [self testDate:@"12/1/2012"]
Run Code Online (Sandbox Code Playgroud)

码:-

-(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);
}
Run Code Online (Sandbox Code Playgroud)

输出日期: -

日期=(null)

时间=(null)

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

输入
"12/1/2012"
输出 日期="12/1/2012"time = null

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

输入 "01:43 am"
输出 日期= null time ="01:43 am"

人们可以在这里得到一个不同的答案Objective-C String(yyyy-mm-dd)到NSDate.如果日期格式设置错误,则指的是答案.

在我的情况下,日期格式是正确的.但它可能只有日期,只有时间或两者兼而有之.要将日期和时间与字符串分开,可以在此处引用ios4 - 将字符串中的日期和时间拆分为两个单独的字符串,但它没有选中的答案或有效的答案.

Anu*_*das 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];
}
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

要么

-(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];
}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)