Преобразование строки даты Adobe PDF в NSDate - PullRequest
1 голос
/ 29 ноября 2010

Строка ввода '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;
}

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

РЕДАКТИРОВАТЬ2: @"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 ]

2 голосов
/ 29 ноября 2010

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

Alex

1 голос
/ 12 января 2012

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

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

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

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

CFDateRef CGPDFStringCopyDate (CGPDFStringRef string );

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

1 голос
/ 29 ноября 2010

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

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

...