Question

Je suis une chaîne qui contient la date actuelle en utilisant ceci:

NSString *date = [[NSDate date] description];

À un autre point que je veux récupérer la date de cette chaîne et je 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>];

Je reçois dateFromString comme nil 0x0. Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Vous ne pouvez pas inventer la syntaxe de chaîne de format et attendre au travail; vous devez utiliser un format réellement documenté. (Sérieusement, "MM" qui signifie "mois", "minute" et "décalage GMT minutes" tous en même temps?)

documentation indique, les 10,4 utiliser chaînes de format Unicode .

Essayez "aaaa-MM-JJ HH: mm: ss ZZZ". À la place

En outre, la source Objective-C est ASCII. Ne pas mettre des personnages comme ± là-bas et espérer qu'il fonctionne dans un contexte; à la place, utiliser des fichiers de chaînes.

Autres conseils

En outre, dateFromString: retourne un NSDate autoreleased, donc:

NSDate *dateFromString = [[NSDate alloc] init]; // <- non freed instance
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; // <- new autoreleased instance
....
[dateFromString release]; // <- wrong

Vous pouvez:

//NSDate *dateFromString = [[NSDate alloc] init];
NSDate *dateFromString = [dateFormatter dateFromString:<NSString containing date>];
....
//[dateFromString release]; // dateFromString is autoreleased

Espérons que cela pourrait sauver quelqu'un:)

Fait Extension NSString pour cela.

// Simple as this.   
date = dateString.dateValue;

Merci à 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>

Une partie de eppz kit , prenez la catégorie NSString + EPPZKit.h de GitHub.


RÉPONSE ORIGINAL:. Que vous n'êtes pas sûr (ou tout simplement ne se soucient pas) sur le format de date contenue dans la chaîne, utiliser NSDataDetector pour ce jour l'analyse syntaxique

//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 .

Il est un port direct de la fonction strtotime impressionnante en PHP 5.4 pour Cocoa et iOS. Il prendra à peu près de tout format arbitraire de chaîne de date ou l'heure et le convertir en un NSDate.

Espérons que cela fonctionne, et bonne chance!

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