【问题标题】:Converting Adobe PDF date String to NSDate将 Adob​​e PDF 日期字符串转换为 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 ;
}

【问题讨论】:

  • 天啊!我做了所有这些研究都白费了! :)

标签: iphone objective-c ipad ios nsdate


【解决方案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:@"..."]];

亚历克斯

【讨论】:

【解决方案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 对象的时区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      相关资源
      最近更新 更多