J'ai obtenu une chaîne qui contient la date actuelle en utilisant ceci:
NSString *date = [[NSDate date] description];
À un autre moment, je veux récupérer la date de cette chaîne et j'ai utilisé le code suivant:
[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehaviorDefault];
[dateFormatter setDateFormat:@"YYYY-MM-DD HH:MM:SS ±HHMM"];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:<NSString containing date>];
J'obtiens dateFromString
comme nil
0x0. Qu'est-ce que je fais mal?
Vous ne pouvez pas inventer la syntaxe d'une chaîne de format et vous attendre à ce qu'elle fonctionne; vous devez réellement utiliser un format documenté. (Sérieusement, "MM" signifie "mois", "minute" et "minutes de décalage GMT" en même temps?)
Comme le souligne documentation , les formateurs 10.4 utilisent chaînes de format Unicode .
Essayez plutôt "aaaa-MM-jj HH: mm: ss ZZZ".
De plus, la source Objective-C est ASCII. Ne mettez pas de caractères comme ± dedans et ne vous attendez pas à ce que cela fonctionne dans n'importe quel contexte; utilisez plutôt des fichiers de chaînes.
De plus, dateFromString: renvoie une NSDate publiée automatiquement, donc:
NSDate *dateFromString = [[NSDate alloc] init]; // <- non freed instance
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; // <- new autoreleased instance
....
[dateFromString release]; // <- wrong
Vous voudrez peut-être:
//NSDate *dateFromString = [[NSDate alloc] init];
NSDate *dateFromString = [dateFormatter dateFromString:<NSString containing date>];
....
//[dateFromString release]; // dateFromString is autoreleased
J'espère que cela pourrait sauver quelqu'un :)
Création d'une extension NSString pour cela.
// Simple as this.
date = dateString.dateValue;
Grâce à NSDataDetector , il reconnaît beaucoup de format.
// Tested in GMT+1 (Hungary).
@"2014-01-16" dateValue is <2014-01-16 11:00:00 +0000>
@"2014.01.16" dateValue is <2014-01-16 11:00:00 +0000>
@"2014/01/16" dateValue is <2014-01-16 11:00:00 +0000>
@"2014 Jan 16" dateValue is <2014-01-16 11:00:00 +0000>
@"2014 Jan 16th" dateValue is <2014-01-16 11:00:00 +0000>
@"20140116" dateValue is <2014-01-16 11:00:00 +0000>
@"01-16-2014" dateValue is <2014-01-16 11:00:00 +0000>
@"01.16.2014" dateValue is <2014-01-16 11:00:00 +0000>
@"01/16/2014" dateValue is <2014-01-16 11:00:00 +0000>
@"16 January 2014" dateValue is <2014-01-16 11:00:00 +0000>
@"01-16-2014 17:05:05" dateValue is <2014-01-16 16:05:05 +0000>
@"01-16-2014 T 17:05:05 UTC" dateValue is <2014-01-16 17:05:05 +0000>
@"17:05, 1 January 2014 (UTC)" dateValue is <2014-01-01 16:05:00 +0000>
Partie de kit eppz! , prenez la catégorie NSString + EPPZKit.h de GitHub.
RÉPONSE ORIGINALE: Que vous ne soyez pas sûr (ou tout simplement ne vous souciez pas) du format de date contenu dans la chaîne, utilisez NSDataDetector pour analyser la date .
//Role players.
NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700";
__block NSDate *detectedDate;
//Detect.
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil];
[detector enumerateMatchesInString:dateString
options:kNilOptions
range:NSMakeRange(0, [dateString length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
{ detectedDate = result.date; }];
Vous pouvez consulter TouchTime.
https://github.com/jheising/TouchTime .
C'est un port direct de la fonction géniale strtotime en PHP en 5.4 pour Cocoa et iOS. Il prendra à peu près n'importe quel format arbitraire de chaîne de date ou d'heure et le convertira en NSDate.
J'espère que cela fonctionne et profitez-en!