views:

39

answers:

2

I set a Date with 'DateFromComponents" and when I read it out... its wrong. I have to set the DAY to the 2nd or anything later so I get the right Year?!? I set year 2011 and when I read it out i get Year 2010 !!


 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]);

------- Here I get 1 January 2010 /// 2010 not 2011 !?!?

how to fix that.

thx chris

+1  A: 

I ran this 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);
}

... and got this output:

 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

Clearly the problem is in the formatter and not the date. However, I don't see what could be wrong with the formatter. .

Edit:

Shifting:

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

... to:

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

... solves the problem although I don't know why.

TechZen
:) Full answer here, also didnt know:http://stackoverflow.com/questions/3220176/iphone-nsdatecomponent-wrong-date-1-1-2011/3222483#3222483thx for help
christian Muller
+1  A: 

As stated in http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns, YYYY can differ from the calendar year.

January 1st can belong to the last week of the year before. YYYY will display the year used when mentioning weeks of year (ie week 52 of 2009). If January 1st 2010 belong to the week 52 of 2009, then YYYY will display 2009.

That's why you should use yyyy.

Axel
thanks a lot... works fine :)
christian Muller