Преобразование строки даты 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 в соответствующий часовой пояс.