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