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)
Répondre
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.
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. –
Il y a NSTimeInterval qui possède cette capacité. Peut-être qu'un pattern composite est dans l'ordre ... – WineSoaked
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
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.
Je vais essayer cet analyseur ISO 8601 et unparser pour une situation similaire: http://boredzo.org/iso8601parser/
- 1. iPhone OS 3 SDK?
- 2. iPhone OS/SDK Programmation Info
- 3. Pouvons-nous installer iPhone SDK 4 dans iPhone OS 3
- 4. iPhone OS SDK: Possible de télécharger SDK 3.0 sans Xcode?
- 5. Comment analyser le langage Aras Markup dans l'application iphone SDK?
- 6. Détecter la date de création du fichier sur iPhone OS?
- 7. DataView.RowFilter un ISO8601
- 8. Comment analyser la date dans différentes langues
- 9. iPhone SDK: test de la date de chaîne valide
- 10. UIImagePickerController dans iPhone OS 3.0
- 11. Problème avec la dateformatter dans Iphone sdk
- 12. iPhone: OS minimum, cible de déploiement et base/SDK actif
- 13. Comment installer iphone sdk 4 sur Mac OS X 10.5.8
- 14. Allocation de mémoire dynamique 2D - ObjectiveC
- 15. Analyseur AMF0 dans ObjectiveC
- 16. Comment faire pour analyser la page web HTML dans Iphone OS 4.0
- 17. Où puis-je télécharger l'ancien iPhone OS 3.1 SDK?
- 18. iPhone OS Deployment Cible après la mise à jour vers iPhone SDK 4
- 19. Problème dans dateFormatter dans Iphone sdk?
- 20. Obtenir l'horodatage ISO8601 actuel
- 21. police dans iphone sdk?
- 22. MVC utilisé dans la programmation ObjectiveC
- 23. Script dans iPhone SDK
- 24. discuter dans iphone sdk?
- 25. webservice Dans Iphone SDK?
- 26. iphone sdk 4.0 compatibilité
- 27. iPhone SDK: Essayer 4,0
- 28. iphone SDK: Comment implémenter un sélecteur de date modal?
- 29. iphone os 3.0 doc set
- 30. Comment convertir un horodatage ISO8601 en heure unix en Perl?
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) –
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.". –