2010-11-29 9 views
1

La chaîne d'entrée est '20100908041312'Conversion Adobe PDF Date de chaîne à NSDate

le format est année, mois, jour, heures, minutes, secondes, le fuseau horaire

et j'ai ben essayé de le convertir à un NSDate avec ceci: @"yyyyMMddHHmmsszz"

Mais NSDate est nul, tout le monde voit ce que je fais mal?

-(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: son fuseau horaire casser

EDIT2: @"yyyyMMddHHmmssTZD" il cesse de revenir à zéro, mais dosnt choisir le fuseau horaire correctement

EDIT3: Ce fut le code I Used à la fin. ..i trouvé que le format change de PDF en PDF de sorte que le code traite des variations que j'ai trouvé, dans certains cas ce wont extrait le fuseau horaire correctement.

-(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! J'ai fait toutes ces recherches pour rien! :) –

+0

il a été apprécié de toute façon :) –

Répondre

1

Je reconnais l'affichage est plus d'un an vieux, mais pas le temps est trop tard pour une meilleure réponse.

Puisque vous spécifiez la chaîne d'entrée est une chaîne de date Adobe PDF, le format doit être conforme à la spécification PDF, qui par la spécification est: YYYYMMDDHHmmSSOHH'mm (en omettant le préfixe D :). Notez que votre chaîne d'entrée a une longueur de 14 caractères et que votre format NSDate a une longueur de 16 caractères, donc le fuseau horaire n'est pas dans votre chaîne d'entrée comme indiqué.

Néanmoins, la vraie réponse à votre question est d'utiliser la Quartz fonction 2D CGPDFString:
 
CFDateRef CGPDFStringCopyDate (CGPDFStringRef string );

La fonction retourne un CFDateRef qui a un pont sans frais pour NSDate, afin que vous puissiez passez la date lue d'un PDF à cette fonction et récupérez facilement un NSDate en castant.

1

"12" est pas une zone de temps valable pour l'un des motifs de format de date Unicode, donc retourne NSDateFormatter rien. http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Vous devrez peut-être utiliser tous les deux chiffres à l'exception des deux derniers, puis définissez le fuseau horaire de votre nouvel objet NSDate en traduisant le numéro à deux chiffres d'Adobe dans un fuseau horaire approprié.

+0

Cheers, travaillant sur ce maintenant –

2

Il devrait suivre la norme unicode pour le setDateFormat: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Vous devriez être en mesure de définir le fuseau horaire ainsi:

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

Alex

+1

Vous pourriez vouloir jeter un oeil à cela pour les fuseaux horaires possibles: http://developer.apple.com/library/mac/#documentation/CoreFoundation/ Référence/CFTimeZoneRef/Reference/reference.html% 23 // apple_ref/doc/uid/20001201 – Alex