将Adobe PDFdatestring转换为NSDate

input的string是'20100908041312'

格式是年,月,日,小时,分钟,秒,时区

我已经试图将其转换为NSDate: @"yyyyMMddHHmmsszz"

但NSDate是零,任何人看到我在做什么错了?

 -(NSDate*)convertPDFDateStringAsDate:(NSString*) _string{ //20100908041312 //year month day Hours minutes seconds and time zone NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyyMMddHHmmsszz"]; NSDate *date = [dateFormat dateFromString:_string]; //date is nil... [dateFormat release]; return date; } 

编辑:它的时区打破

EDIT2: @"yyyyMMddHHmmssTZD"停止返回零,但dosnt正确select时区

编辑3:这是我最终使用的代码…我发现格式从PDF更改为PDF,所以代码处理我发现的变化,在某些情况下,这将不会提取时区正确。

 -(NSDate*)convertPDFDateStringAsDate:(NSString*) _string{ NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; NSString * formatCheck = [_string substringToIndex:2]; if(![formatCheck isEqualToString:@"D:"]) { NSLog(@"ERROR: Date String wasnt in expected format"); return nil;//return [NSDate date]; } NSString * extract = [_string substringFromIndex:2]; //NSLog(@"DATESTRING:'%@'",extract);NSLog(@"DATELENGTH:%i",[extract length]); if([extract length]>14) { [dateFormat setDateFormat:@"yyyyMMddHHmmssTZD"]; } else { [dateFormat setDateFormat:@"yyyyMMddHHmmss"]; } NSDate * date = [dateFormat dateFromString:extract]; [dateFormat release]; return date ; } 

我认识到这个post已经过了一年多了,但是没有时间来得到更好的答案。

由于您指定的inputstring是一个Adobe PDFdatestring,所以格式应该符合PDF规范,其规格是: YYYYMMDDHHmmSSOHH'mm (省略前缀D :)。

请注意,您的inputstring长度为14个字符,您的NSDate格式为16个字符长,因此时区不在您input的string中。

尽pipe如此,真正的答案是使用Quartz 2D CGPDFString函数:

CFDateRef CGPDFStringCopyDate (CGPDFStringRef string );

该函数返回一个CFDateRef,它有一个免费的桥梁到NSDate,所以你可以将从PDF中读取的date传递给这个函数,并通过强制转换轻松获取一个NSDate。

它应该遵循setDateFormat的unicode标准: http : //unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

你应该能够这样设置时区:

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyyMMddHHmmss"]; //Optionally for time zone conversations [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]]; 

亚历克斯

“12”不是任何Unicodedate格式模式的有效时区,所以NSDateFormatter不返回任何内容。 http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

您可能必须使用除最后两位数以外的所有数字,然后通过将Adobe的两位数号码转换为适当的时区,在新的NSDate对象上设置时区。