2010-12-29 8 views
2

Ich glaube, dass NSDate/NSCalendar einen Fehler oder zwei auf iOS 4.2 hat.NSDate und andere auf iOS 4.2

wird immer mit GMT gedruckt, d. H. Die lokale Zeitzoneneinstellung wird ignoriert. Wurde bereits gemeldet, ist aber enthalten, um die Ausgabe unten hoffentlich besser zu erklären.

[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateA] 

den richtigen Wert nicht immer zurückkommt, während dies tut:

[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateA] 

Basierend auf einem früheren Post, ich einige Test-Code erstellt:

NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; 

NSDate* dateA = [formatter dateFromString:@"2010-12-29 11:11:17 +1100"]; 
NSDate* dateB = [formatter dateFromString:@"2010-12-29 10:11:17 +1100"]; 
NSDate* dateC = [formatter dateFromString:@"2010-12-27 11:11:17 +1100"]; 
NSDate* dateD = [formatter dateFromString:@"2010-12-27 10:11:17 +1100"]; 
NSLog(@"dateA=%@, %@", dateA, [formatter stringFromDate:dateA]); 
NSLog(@"dateB=%@, %@", dateB, [formatter stringFromDate:dateB]); 
NSLog(@"dateC=%@, %@", dateC, [formatter stringFromDate:dateC]); 
NSLog(@"dateD=%@, %@", dateD, [formatter stringFromDate:dateD]); 

NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSLog(@"timezone=%@", [calendar timeZone]); 

NSLog(@"A day inUnit:Year=%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateA]); 
NSLog(@"B day inUnit:Year=%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateB]); 
NSLog(@"C day inUnit:Year=%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateC]); 
NSLog(@"D day inUnit:Year=%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:dateD]); 
NSLog(@"A day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateA]); 
NSLog(@"B day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateB]); 
NSLog(@"C day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateC]); 
NSLog(@"D day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateD]); 

und bekam diesen Ausgang :

[33920:207] dateA=2010-12-29 00:11:17 +0000, 2010-12-29 11:11:17 +1100 
[33920:207] dateB=2010-12-28 23:11:17 +0000, 2010-12-29 10:11:17 +1100 
[33920:207] dateC=2010-12-27 00:11:17 +0000, 2010-12-27 11:11:17 +1100 
[33920:207] dateD=2010-12-26 23:11:17 +0000, 2010-12-27 10:11:17 +1100 
[33920:207] timezone=Australia/Hobart (GMT+11:00) offset 39600 (Daylight) 
[33920:207] A day inUnit:Year=363 
[33920:207] B day inUnit:Year=363 
[33920:207] C day inUnit:Year=361 
[33920:207] D day inUnit:Year=361 
[33920:207] A day inUnit:Era =734135 
[33920:207] B day inUnit:Era =734134 
[33920:207] C day inUnit:Era =734133 
[33920:207] D day inUnit:Era =734132 

Antwort

0

Ich sehe die s ein Problem. Sieht nicht so aus, als ob die ordinalityOfUnit die Zeitzone respektiert

1

Ich habe festgestellt, dass ich durch die Verschiebung des Datums um den Zeitzonen-Offset eine konsistente Ordinalzahl erhalten habe.

Unter DATEC und datierte aus dem Code:

NSTimeZone *tz = [[NSCalendar autoupdatingCurrentCalendar] timeZone]; 
NSTimeInterval offset = [tz secondsFromGMT]; 

NSDate* dateC = [formatter dateFromString:@"2010-12-27 11:11:17 +1100"]; 
NSDate* dateD = [formatter dateFromString:@"2010-12-27 10:11:17 +1100"]; 

NSLog(@"dateC=%@, %@", dateC, [formatter stringFromDate:dateC]); 
NSLog(@"dateD=%@, %@", dateD, [formatter stringFromDate:dateD]); 

dateC = [dateC dateByAddingTimeInterval: offset]; 
dateD = [dateD dateByAddingTimeInterval: offset]; 

NSLog(@"C day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnitinUnit:NSEraCalendarUnit forDate: dateC]); 
NSLog(@"D day inUnit:Era =%d", [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate: dateD]); 

ergibt die gleiche Ordinalität für beide.