NSString à NSDate
-
20-09-2019 - |
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?
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!
Comme déjà répondu, c'est-ce qui se passe lorsque vous inventez un nouveau sytax.
Basé sur Apple la documentation de NSDateFormatter Référence de la classe
Il y a beaucoup d'attributs que vous pouvez obtenir et de définir un style Date formatter , ... Nous vous encourageons cependant, ne pas modifier les paramètres individuels . Au lieu de cela, vous devez accepter les paramètres par défaut établis lors de l'initialisation et spécifier le format en utilisant setDateStyle :, setTimeStyle:
Ceci est particulièrement important pour la sortie, ce qui est différent pour chaque lieu. Par défaut NSDateFormatter observe les paramètres régionaux de l'utilisateur actuel. Ainsi, le même NSDate pourrait être 22.11.2011 18:33:19
ou Nov 22, 2011 6:33:19 PM
, ou 2011-11-22 下午6:33:19
ou même २२-११-२०११ ६:३३:१९ अपराह्
, tous pour la même entrée et avec le même code.
Considérons par exemple le 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 docs d'Apple pour les différents styles de NSDateFormatterStyle ou ce excellente tutoriel