2010-07-10 9 views
3

J'ai mis une Date avec 'DateFromComponents' et quand je l'ai lue ... c'est faux Je dois mettre le JOUR au 2ème ou quoi que ce soit plus tard pour que j'obtienne la bonne Année?!? Je fixe l'année 2011 et quand je l'ai lu je reçois Année 2010 !!iPhone NSDateComponent faux Date 1.1.2011?


day = 1; 
month = 1; 
year = 2011; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:day]; 
[components setMonth:month]; 
[components setYear:year]; 
NSDate *date = [gregorian dateFromComponents:components]; 
[gregorian release]; 


NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"DD MMMM YYYY"]; 
NSLog (@"hmm: %@",[dateFormatter stringFromDate:actDate]); 

------- ici, je me 1 January 2010 /// 2010 not 2011!?!?

comment résoudre ce problème.

thx chris

+0

J'ai eu exactement le même problème, même date même! AAAA -> aaaa dans le format de date l'a corrigé. Je veux ces heures de ma vie, s'il te plaît. – Bogatyr

Répondre

6

j'ai couru ce code:

NSInteger day = 1; 
NSInteger month = 1; 
NSInteger year =0; 
NSCalendar *gregorian; 
NSDateComponents *components; 
NSDate *theDate; 
NSDateFormatter *dateFormatter; 
for (int i=2005; i<2015; i++) { 
    year= i; 
    gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    components = [[NSDateComponents alloc] init]; 
    [components setDay:day]; 
    [components setMonth:month]; 
    [components setYear:year]; 
    theDate = [gregorian dateFromComponents:components]; 
    [gregorian release]; 


    dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormatter setDateFormat:@"DD MMMM YYYY"]; 
    NSLog(@"year=%d",year); 
    NSLog (@"hmm: %@",[dateFormatter stringFromDate:theDate]); 
    NSLog(@"theDate=%@\n\n",theDate); 
} 

... et a obtenu cette sortie:

year=2005 
hmm: 01 January 2004 
theDate=2005-01-01 00:00:00 -0600 

year=2006 
hmm: 01 January 2006 
theDate=2006-01-01 00:00:00 -0600 

year=2007 
hmm: 01 January 2007 
theDate=2007-01-01 00:00:00 -0600 

year=2008 
hmm: 01 January 2008 
theDate=2008-01-01 00:00:00 -0600 

year=2009 
hmm: 01 January 2008 
theDate=2009-01-01 00:00:00 -0600 

year=2010 
hmm: 01 January 2009 
theDate=2010-01-01 00:00:00 -0600 

year=2011 
hmm: 01 January 2010 
theDate=2011-01-01 00:00:00 -0600 

year=2012 
hmm: 01 January 2012 
theDate=2012-01-01 00:00:00 -0600 

year=2013 
hmm: 01 January 2013 
theDate=2013-01-01 00:00:00 -0600 

year=2014 
hmm: 01 January 2014 
theDate=2014-01-01 00:00:00 -0600 

Il est clair que le problème est dans le formatter et non la date. Cependant, je ne vois pas ce qui ne va pas avec le formateur. .

Edit:

Shifting:

[dateFormatter setDateFormat:@"DD MMMM YYYY"]; 

... à:

[dateFormatter setDateFormat:@"DD MMMM yyyy"]; 

... résout le problème même si je ne sais pas pourquoi.

+1

:) Réponse complète ici, ne savait pas non plus: http://stackoverflow.com/questions/3220176/iphone-nsdatecomponent-wrong-date-1-1-2011/3222483#3222483 thx pour l'aide –

4

Comme indiqué dans http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns, YYYY peut différer de l'année civile.

Le 1er janvier peut appartenir à la dernière semaine de l'année précédente. YYYY affichera l'année utilisée en mentionnant les semaines de l'année (c.-à-d. La semaine 52 de 2009). Si le 1er janvier 2010 appartient à la semaine 52 de 2009, alors YYYY affichera 2009.

C'est pourquoi vous devriez utiliser yyyy.

+0

merci beaucoup. .. fonctionne bien :) –

+0

Ceci est énorme - merci pour cela, il me rendait fou! – Bogatyr