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);
comment vous voulez définir ur la date? Je pense que votre formateur n'est pas correct. – Saad
Eh bien, je dois convertir la chaîne qui est dans le format 'Mer Mar 13' à un' NSDate' –