将 Adob​​e PDF 日期字符串转换为 NSDate

Posted

技术标签:

【中文标题】将 Adob​​e PDF 日期字符串转换为 NSDate【英文标题】:Converting Adobe PDF date String to NSDate 【发布时间】:2011-05-17 05:55:17 【问题描述】:

输入字符串是'20100908041312'

格式为年、月、日、时、分、秒、时区

我一直在尝试将其转换为 NSDate:@"yyyyMMddHHmmsszz"

但是 NSDate 是 nil,有人知道我做错了什么吗?

-(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" 停止它返回 nil,但不正确选择时区

EDIT3:这是我最后使用的代码...我发现格式从 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 ;

【问题讨论】:

天啊!我做了所有这些研究都白费了! :) 【参考方案1】:

它应该遵循 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:@"..."]];

亚历克斯

【讨论】:

您可能想看看可能的时区:developer.apple.com/library/mac/#documentation/CoreFoundation/…【参考方案2】:

我知道该帖子已经发布了一年多,但现在给出更好的答案还为时不晚。

由于您指定输入字符串是 Adob​​e PDF 日期字符串,因此格式应符合 PDF 规范,根据规范为:YYYYMMDDHHmmSSOHH'mm(省略前缀 D:)。

请注意,您的输入字符串长度为 14 个字符,而您的 NSDate 格式长度为 16 个字符,因此时区不在您的输入字符串中。

不过,您问题的真正答案是使用 Quartz 2D CGPDFString 函数: CFDateRef CGPDFStringCopyDate (CGPDFStringRef string );

该函数返回一个 CFDateRef,它具有到 NSDate 的免费桥接,因此您可以将从 PDF 读取的日期传递给该函数,并通过强制转换轻松取回 NSDate。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于将 Adob​​e PDF 日期字符串转换为 NSDate的主要内容,如果未能解决你的问题,请参考以下文章

PDF 压缩 Adob​​e 是如何做到的?

使用 DNS 记录将域指向 Adob​​e Business Catalyst 托管

环回将日期之类的字符串转换为日期,如何防止它

将 Flex 转换为 Adob​​e Air

将 Adob​​e Flash Builder 游戏转换为 Air?

如何在 Adob​​e Flex 中显示 PDF?