Question

Si j'utilise le code suivant:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);

Il est converti en un objet Date, cependant, je ne peux pas sembler avec succès le formater autrement que yyyy-MM-dd'T'HH:mm, à savoir ce qui sera connecté est 2010-01-28T15:22:23

Si je change le dateFormat dire [dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; l'objet Date est nulle ...

Alors, ma question ultime est de savoir comment formater un horodatage ISO8601 à partir d'une base de données SQL à utiliser, par exemple, NSDateFormatterMediumStyle revenir « 1. Janvier, 2010 »?

Était-ce utile?

La solution

Vous avez besoin d'un autre formatter pour gérer la sortie. Mettez cela après votre code:

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);

Autres conseils

J'ai un problème mais similaire un peu plus complexe, et je l'ai trouvé une solution très simple!

Le problème: Mes dates ISO8601 entrants ressembler à ceci: 2006-06-14T11:06:00+02:00 Ils ont un décalage horaire à la fin

.

La solution: Utilisez Peter Hosey ISO8601DateFormatter que vous pouvez télécharger à partir .

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;

et

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;

Voici un exemple de code de la pomme

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate *date = [formatter dateFromString:dateString];

lien: https://developer.apple.com/library /ios/#qa/qa1480/_index.html

Il suffit de mentionner que depuis iOS 6.0, vous pouvez utiliser ce format:

 yyyy-MM-dd'T'HH:mm:ssZZZZZ

J'ai une implémentation C très rapide de l'analyse syntaxique ISO8601 NSStrings à NSDates SAMCategories . Vous pouvez l'installer avec CocoaPods ou tout simplement copier les fichiers sur votre projet.

Voici comment l'utiliser:

[NSDate sam_dateFromISO8601String:@"2013-08-24T06:51:21-07:00"]

Il est très robuste et prend en charge les fuseaux horaires manquants, etc. Comme mon commentaire ci-dessus dit NSDateFormatter était très lent pour moi lors de l'analyse beaucoup de dates. Le passage à cette mise en œuvre a contribué à une quantité immense.

Ce code est utilisé dans 6 applications de production (y compris Hipstamatic et Roon ) que j'ai travaillé sans connu problèmes. Il y a une rel="nofollow pour éviter la régression.

En bref, je pense que cela est la meilleure façon d'analyser des chaînes ISO8601 en Objective-C.


Un court côté, si vous êtes préoccupé par la performance et le transfert, l'envoi d'entiers au lieu de chaînes ISO8601 est fortement préférée. Vous pouvez simplement les convertir en dates avec [NSDate dateWithTimeIntervalSince1970:yourInteger]. La performance est aussi vite que vous pouvez le faire et il y a des personnages moins à transférer sur le fil.

Je dois souligner que j'ai vérifié la dernière fois les pommes méthodes de NSDate ne prennent pas en charge ISO8601. J'ai encore un bug avec Apple à mettre dans le soutien officiel.

+ (id)dateWithNaturalLanguageString:(NSString *)string

sera correctement (la dernière fois je l'ai couru) analyser et créer un objet NSDate à partir d'une chaîne de ISO801, bien que la documentation que vous dit ne devriez pas l'utiliser, il a travaillé sur toutes les dates ISO8601 je l'ai essayé jusqu'à présent.

réponse @danielbeard a fonctionné pour moi. Cependant, vous devez inclure le fuseau horaire sinon il convertit une date UTC dans votre fuseau horaire actuel qui n'est pas ce que vous voulez.

- (NSDate *) dateFromISO8601DateString:(NSString *) dateString {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate * date = [dateFormatter dateFromString:dateString];
    return date;
}

capitaine @Thread Essayez ce Format: "aaaa-MM-jj'T'HH: mm: ss.sss"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top