Est-il un moyen simple de convertir un horodatage ISO8601 à un NSDate formaté?
-
18-09-2019 - |
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 »?
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"