Though NSDateFormatter behaves slightly different than documented, the following might even be correct, as strange as it might look (mind the last two lines):
-(void)testNSDateFormatterTrap { NSDateFormatter *lower = [[[NSDateFormatter alloc] init] autorelease]; lower.dateFormat = @"yyyy-MM-dd HH:mm:SS ZZZ"; NSDateFormatter *upper = [[[NSDateFormatter alloc] init] autorelease]; upper.dateFormat = @"YYYY-MM-dd HH:mm:SS ZZZ"; lower.timeZone = upper.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; NSDate *d = [lower dateFromString:@"1970-01-01 00:00:00 +0000"]; STAssertEqualObjects(@"1970-01-01 00:00:00 +0000", [lower stringFromDate:d], @"lower iso wrong"); STAssertEqualObjects(@"1970-01-01 00:00:00 +0000", [upper stringFromDate:d], @"upper iso wrong"); d = [d addTimeInterval:(-60*60)]; STAssertEqualObjects(@"1969-12-31 23:00:00 +0000", [lower stringFromDate:d], @"lower iso wrong"); STAssertEqualObjects(@"1970-12-31 23:00:00 +0000", [upper stringFromDate:d], @"upper iso wrong"); }
The Unicode Format Pattern Documentation explains the difference of the upper- and lowercase year format – but frankly I don’t get the “Year of week of year” idea.
But that subtracting one hour in fact adds almost a whole year – that’s odd to me.
So I rather stay away from the uppercase form – be it correct or buggy.
Seen with iPhone SDK 3.1.2 and XCode 3.2.1 on Snow Leopard.
Update:
I think I got it! Uppercase YYYY makes sense only in combination with a calendar week – and not months or quarters.
Look at January 1st 2010. It belongs to calendar week 53 of 2009. Week 1/2010 starts on Jan 4th.