2010-12-29 11 views
2

NSDate/NSCalendarには、iOS 4.2にバグが2つあると思います。iOS 4.2のNSDateらの不具合

[[NSDate date] description] 

は、常にGMTを使用して印刷します。つまり、ローカルタイムゾーンの設定は無視されます。これまでに報告されていますが、以下の出力をうまく説明するために含まれています。これがないながら

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

は常に、正しい値を返しません:

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

は前のポストに基づいて、私はいくつかのテストコード作成:

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

をし、この出力を得ました:

[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 

答えて

0

私は見ていますame issue。 ordinalityOfUnitがタイムゾーンを尊重するように見えません

1

私はタイムゾーンのオフセットで日付をオフセットすることで、一貫した順序性を得ることがわかりました。

dateCを撮影します。コードからの日付:

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

は両方に同じ規則性が得られます。