38 votes

NSString to NSDate

J'ai une chaîne contenant la date du jour 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>];
 

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

64voto

Nicholas Riley Points 26161

Vous ne pouvez pas inventer format des chaînes de caractères syntaxe et espérer qu'il fonctionne, vous avez besoin d'utiliser effectivement un format documenté. (Sérieusement, "MM", qui signifie "mois", "minute" et "décalage GMT minutes" tous en même temps?)

Comme la documentation , la 10.4 les formateurs de l'utilisation de l'Unicode des chaînes de format.

Essayez "yyyy-MM-dd HH:mm:ss ZZZ" à la place.

Aussi, Objective-C source ASCII. Ne mettez pas de caractères comme ± y et espérer qu'il fonctionne dans n'importe quel contexte; au lieu de cela, utiliser des chaînes de fichiers.

7voto

grilix Points 2036

En outre, dateFromString: retourne un NSDate auto-libéré, 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 :)

3voto

Geri Points 3572

Faites un NSString extension pour que.

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

Grâce à NSDataDetector, il reconnaît tout un tas 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 l' eppz!kit, prenez la catégorie NSString+EPPZKit.h à partir de GitHub.


RÉPONSE ORIGINALE à cette question: Si vous ne savez pas (ou ne s'en soucient pas) sur le format de la date contenue dans la chaîne, utilisez NSDataDetector pour l'analyse de 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; }];

2voto

Jim Heising Points 2285

Vous pouvez vérifier TouchTime.

https://github.com/jheising/TouchTime .

C'est un portage direct de l'impressionnante fonction strtotime en PHP 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!

-1voto

Carlos Barcelona Points 713

Comme déjà répondu, qu'est ce qui se passe quand vous inventez une nouvelle sytax.

Basé sur l'Apple NSDateFormatter de la Classe de Référence de la documentation

Il existe de nombreux attributs que vous pouvez obtenir et de définir un style de date formateur, ... Vous êtes encouragés, toutefois, de ne pas modifier les paramètres individuels. Au lieu de cela, vous devez accepter les paramètres par défaut créé lors de l'initialisation et de spécifier le format à l'aide de setDateStyle:, setTimeStyle:

Ceci est particulièrement important pour la production, ce qui est différent pour chaque jeu de paramètres régionaux. Par défaut NSDateFormatter observe le courant de l'utilisateur paramètres régionaux. Donc, le même NSDate pourrait être 22.11.2011 18:33:19ou Nov 22, 2011 6:33:19 PMou 2011-11-22 下午6:33:19 ou même २२-११-२०११ ६:३३:१९ अपराह्, tous pour la même entrée et avec le même code.

Considérez par exemple ce code

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateStyle:NSDateFormatterShortStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];

// ShortStyle used: 11/23/37 3:30pm
NSString *dateString = [dateFormatter stringFromDate:date];

Vérifier Apple docs pour les différents styles de NSDateFormatterStyle ou cet excellent tutoriel

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X