Преобразование даты Adobe PDF String в NSDate

Входная строка: '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;
}

EDIT: его часовой пояс, нарушающий его

EDIT2: @"yyyyMMddHHmmssTZD" останавливает его, возвращая нуль, но dosnt правильно выбирает часовой пояс

EDIT3: Это был код, который я использовал в конце... я обнаружил, что формат изменяется от PDF к PDF, поэтому код имеет дело с вариациями, которые я нашел, в некоторых случаях это wont своевременно извлеките часовой пояс.

-(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

Я признаю, что публикация старше года, но нет времени для лучшего ответа.

Поскольку вы указываете, что входная строка представляет собой строку даты Adobe PDF, формат должен соответствовать спецификации PDF, которая соответствует спецификации: YYYYMMDDHHmmSSOHH'mm (исключая префикс D:).

Обратите внимание, что ваша строка ввода составляет 14 символов, а формат NSDate - 16 символов, поэтому часовой пояс не указан в вашей входной строке, как указано.

Тем не менее, реальный ответ на ваш вопрос заключается в использовании функции Quartz 2D CGPDFString:

CFDateRef CGPDFStringCopyDate (CGPDFStringRef string );

Функция возвращает CFDateRef, который имеет бесплатный мост для NSDate, поэтому вы можете передать дату, прочитанную из PDF, в эту функцию и легко вернуть NSDate путем кастинга.

Ответ 2

Он должен следовать стандарту unicode для setDateFormat: 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:@"..."]];

Алекс

Ответ 3

"12" не является допустимым часовым поясом для любого из шаблонов формата даты Юникода, поэтому NSDateFormatter ничего не возвращает. http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Возможно, вам придется использовать все, кроме двух последних цифр, а затем установить часовой пояс на новом объекте NSDate, переведя двузначное число Adobe в соответствующий часовой пояс.