2012-05-20 3 views
0

myObject.theEnd et myObject.theStart sont des chaînes et il a le format de date de Thu Feb 31 comme sage ...Réglage NSDate de NSString ne fonctionne pas

NSDateFormatter *format=[[NSDateFormatter alloc] init]; 
     [format setDateFormat:@"EEE MMM dd"]; 
     NSDate *end = [format dateFromString:myObject.theEnd]; 
     NSDate *start = [format dateFromString:myObject.theStart]; 
     NSDate *current = [NSDate date]; 

Lorsque theEnd est Thu Feb 31, NSDate *end montre que 1970-5-19 14:30 +0000. C'est la même chose avec NSDate *start et NSDate *current.

Pourquoi est-ce? et comment puis-je résoudre cela?

+1

comment vous voulez définir ur la date? Je pense que votre formateur n'est pas correct. – Saad

+0

Eh bien, je dois convertir la chaîne qui est dans le format 'Mer Mar 13' à un' NSDate' –

Répondre

6

Je parie theEnd n'est pas MONTRANT 1970-05-19 14:30 +0000. Je parie que ça montre (null) puisqu'il n'y a jamais de 31 Février! par exemple. Je reçois:

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"EEE MMM dd"]; 
NSDate *end = [format dateFromString:@"Thu Feb 31"]; 
NSLog(@"end = %@", end); 

=>

2012-05-20 16:38:31.620 test-date[42307:707] end = (null) 

Aussi je parie que vous êtes dans un fuseau horaire qui est de 9,5 heures est de UTC. Et 1970-05-19 14:30 +0000 est réellement ce que vous obtiendrez alors lorsque vous parserez la date d'aujourd'hui de Sun May 20. Par exemple, je suis actuellement en BST si UTC + 0100 et je reçois:

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"EEE MMM dd"]; 
NSDate *start = [format dateFromString:@"Sun May 20"]; 
NSLog(@"start = %@", start); 

=>

2012-05-20 16:38:31.621 test-date[42307:707] start = 1970-05-19 23:00:00 +0000 

Comme il est l'analyse syntaxique à 1970-05-20 00:00:00 (il n'y a pas d'année pour que le composant est "0" = 1970) dans le fuseau horaire actuel, qui est 1970-05-19 23:00:00 +0000 en UTC.

Si vous voulez contourner ce problème, puis définissez le fuseau horaire de l'formatter UTC:

[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

Pour l'année dans l'année en cours, vous pouvez faire quelque chose comme ceci:

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"EEE MMM dd"]; 
[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

NSDate *start = [format dateFromString:@"Sun May 20"]; 
NSLog(@"start = %@", start); 

NSDate *today = [NSDate date]; 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *todayComponents = [gregorian components:NSYearCalendarUnit fromDate:today]; 
NSDateComponents *startComponents = [gregorian components:(NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:start]; 

[startComponents setYear:[todayComponents year]]; 
[startComponents setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

start = [gregorian dateFromComponents:startComponents]; 

NSLog(@"start = %@", start); 

Ce n'est pas si joli, mais ça marche. Sinon, vous pouvez simplement ajouter l'année en cours à la chaîne que vous passez dans le formatter et ajouter yyyy au style formatter:

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"EEE MMM dd yyyy"]; 
[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

NSDate *today = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *todayComponents = [gregorian components:NSYearCalendarUnit fromDate:today]; 

NSString *dateString = [NSString stringWithFormat:@"Sun May 20 %i", [todayComponents year]]; 

NSDate *start = [format dateFromString:dateString]; 
NSLog(@"start = %@", start); 
+0

Eh bien, j'ai une chaîne qui a le format 'Sun Mar 13', et je dois le convertir en un' NSDate' objet. Comment puis-je le faire ? –

+0

Mais que voulez-vous que parser? «Sun Mar 13» n'est pas très bien défini (c'est-à-dire en quelle année?). Voir mon édition pour savoir comment faire cette analyse à '1970-03-13 00:00:00 + 0000'. Peut-être que c'est OK pour votre but? – mattjgalloway

+0

C'est en fait l'année qui cause le problème. L'année sera toujours l'année en cours '2012', mais je passe est dans le format 'Sun mai 20' (sans l'année). J'ai besoin de 'NSDate * start' pour avoir l'année en tant que' 2012' au lieu d'avoir '1970' –