2010-11-29 21 views
1

Der String-Eingang ist '20100908041312'Konvertieren von Adobe PDF-Datum String zu NSDate

das Format Jahr, Monat, Tag, Stunden, Minuten, Sekunden, die Zeitzone

und ich habe ben versucht, es zu konvertieren zu einem NSDate mit diesem: @"yyyyMMddHHmmsszz"

Aber NSDate ist Null, jemand sehen, was ich falsch mache?

-(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: es ist die Zeitzone es

EDIT2 brechen: @"yyyyMMddHHmmssTZD" es null zurückkehrt stoppt, aber dosnt richtig

EDIT3 die Zeitzone wählen: Dies ist der Code war ich am Ende verwendet. ..i fand heraus, dass das Format von PDF zu PDF ändert, so dass der Code die Variationen behandelt, die ich gefunden habe, in einigen Fällen wont die Zeitzone richtig extrahieren.

-(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 ; 
} 
+2

D'oh! Ich habe die ganze Forschung umsonst gemacht! :) –

+0

es wurde trotzdem geschätzt :) –

Antwort

1

ich das Posting erkennen mehr als einem Jahr ist alt, aber keine Zeit ist zu spät für eine bessere Antwort.

Da Sie die Eingabezeichenfolge ist ein Adobe PDF-Datum Zeichenfolge angeben, dann wird das Format der PDF-Spezifikation entsprechen sollten, die gemäß der Spezifikation ist: YYYYMMDDHHmmSSOHH'mm (das Präfix D :) weggelassen.

Beachten Sie, dass Ihre Eingabezeichenfolge 14 Zeichen lang und Ihr NSDate-Format 16 Zeichen lang ist. Daher befindet sich die Zeitzone nicht wie angegeben in Ihrer Eingabezeichenfolge.

Dennoch ist die wirkliche Antwort auf Ihre Frage ist die Quartz 2D CGPDFString verwenden Funktion:
 
CFDateRef CGPDFStringCopyDate (CGPDFStringRef string );

Die Funktion gibt einen CFDateRef gibt, die eine gebührenfreie Brücke zu NSDate hat, so können Sie Übergeben Sie das von einer PDF-Datei gelesene Datum an diese Funktion, und rufen Sie einfach ein NSDate durch Casting zurück.

1

„12“ ist keine gültige Zeitzone für eine der Formatmuster Unicode Datum, so NSDateFormatter nichts zurückgibt. http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Möglicherweise müssen Sie alle bis auf die letzten zwei Ziffern verwenden und dann die Zeitzone für Ihr neues NSDate-Objekt festlegen, indem Sie die zweistellige Adobe-Nummer in eine geeignete Zeitzone umwandeln.

+0

Cheers, arbeitet an diesem jetzt –

2

Es sollte die Unicode-Standard für die setDateFormat folgen: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

sollten Sie in der Lage sein, die Zeitzone einstellen auf diese Weise:

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

Alex

+1

Sie möchten vielleicht einen Blick auf die möglichen Zeitzonen haben: http://developer.apple.com/library/mac/#documentation/CoreFoundation/ Referenz/CFTimeZoneRef/Referenz/reference.html% 23 // apple_ref/doc/uid/20001201 – Alex