Преобразование строки даты Adobe PDF в 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;
}

РЕДАКТИРОВАТЬ: его часовой пояс нарушая его

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

РЕДАКТИРОВАТЬ 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 ;
}

3 ответа

Решение

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

Поскольку указанная входная строка является строкой даты Adobe PDF, формат должен соответствовать спецификации PDF, которая в соответствии со спецификацией: ГГГГММДДЧЧммССОН * мм (без префикса D:).

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

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

CFDateRef CGPDFStringCopyDate (CGPDFStringRef string );

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

Он должен соответствовать стандарту Юникод для setDateFormat: http://unicode.org/reports/tr35/tr35-6.html

Вы должны быть в состоянии установить часовой пояс следующим образом:

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

Alex

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

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

Другие вопросы по тегам