【问题标题】:NSDate et al woes on iOS 4.2NSDate 等人在 iOS 4.2 上的困境
【发布时间】:2010-12-29 00:38:10
【问题描述】:

我相信 NSDate/NSCalendar 在 iOS 4.2 上有一两个错误。

[[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

【问题讨论】:

    标签: nsdate


    【解决方案1】:

    我发现通过将日期偏移时区偏移量,我得到了一致的序数。

    从您的代码中获取 dateC 和 dateD:

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

    对两者产生相同的序数。

    【讨论】:

      【解决方案2】:

      我看到了同样的问题。看起来 ordinalityOfUnit 不尊重时区

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多