2010-05-09 4 views
7

Comment analyser "2010-04-30T00: 45: 48.711127" dans un NSDate? (et maintenir toute la précision)Analyser la date ISO8601 dans Objective-C (iPhone OS SDK)

+1

double possible de [Parsing formats de date non pris en charge dans via NSDate Cocoa ’] (http://stackoverflow.com/questions/399527/parsing-unsupported-date-formats-dans-via-cocoas-nsdate) –

+1

indice FWIW: votre question est ambiguë - il n'est pas 100% clair si vous posez une question "débutant" sur le cacao ("comment faire J'analyse les dates dans un format donné ") ou un avancé. Dans votre cas, basé sur vos commentaires sur les réponses, vous demandiez la version avancée. Cela étant, vous pourriez avoir moins de bruit dans les réponses si vous incluez une note disant par ex. "Je sais que NSDateFormatter peut être utilisé pour ce format, mais il manque de précision à trois endroits trop tôt.". –

Répondre

-1

Il semble que le NSDate n'a qu'une précision de l'ordre de la milliseconde.

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'hh:mm:ss.SSSSSS"]; 

    NSDate *date = [dateFormatter dateFromString:@"2010-04-30T00:45:48.711127"]; 

    NSLog(@"%@", date); 

    NSString *string = [dateFormatter stringFromDate:date]; 

    NSLog(@"%@", string); 

    [pool drain]; 
    return 0; 
} 

ce code donne le résultat de la console suivante:

Program loaded. 
run 
[Switching to process 27202] 
Running… 
2010-05-08 20:02:46.342 TestNSDate[27202:a0f] 2010-04-30 00:45:48 -0700 
2010-05-08 20:02:46.344 TestNSDate[27202:a0f] 2010-04-30T12:45:48.711000 

Debugger stopped. 
Program exited with status value:0. 

Alors "2010-04-30T00:45:48.711127" se transformer en "2010-04-30T00:45:48.711000" est probablement pas ce que vous avez à l'esprit.

+0

Il semble que nous sommes tous les deux coincés au même point. Je pense que le problème est avec NSDateFormatter cependant, car dans de nombreux endroits il est documenté que NSDate prend en charge la précision de la microseconde. –

+0

Il y a NSTimeInterval qui possède cette capacité. Peut-être qu'un pattern composite est dans l'ordre ... – WineSoaked

+0

Peut-être devrais-je être plus précis: Quelle est l'importance de stocker ces horodatages de résolution inférieurs à la milliseconde (faute d'une meilleure description) dans NSDate lui-même? Une sous-classe qui gère la résolution de la microseconde ne pourrait-elle pas faire la différence pour maintenir la précision supplémentaire dont vous avez besoin? – WineSoaked

4

Vous avez du travail à faire pour vous.

NSDate jettera toutes les valeurs après 3 décimales pour les secondes. Vous pouvez créer une sous-classe de NSDate pour conserver cette précision, mais vous devrez également implémenter votre propre analyse et vos propres formateurs pour les saisir et les afficher puisque NSDateFormatter et CFDateFormatter, sur lequel il est construit, tronqueront également la précision après 3 décimales. des endroits. Selon ce que vous faites, cela ne devrait pas être si difficile.

Ceci est une sous-classe simple (ne mettant pas en œuvre NSCoding ou NSCopying) qui conservera toute la précision que vous lui donnez.

@interface RMPreciseDate : NSDate { 
    double secondsFromAbsoluteTime; 
} 

@end 

@implementation RMPreciseDate 

- (NSTimeInterval)timeIntervalSinceReferenceDate { 
    return secondsFromAbsoluteTime; 
} 

- (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secsToBeAdded { 
    if (!(self = [super init])) 
     return nil; 

    secondsFromAbsoluteTime = secsToBeAdded; 

    return self; 
} 

@end 

Vous pouvez alors demander le -timeIntervalSince1970 pour obtenir le temps d'époque UNIX. Il existe déjà un ISO8601 date/time parser class, mais comme il utilise NSDateComponents pour générer sa date, il est actuellement limité à la précision d'une seconde, mais vous pouvez l'utiliser comme point de départ pour créer des représentations plus précises.