為什么輸出的最后兩行相同?
使用 NSCalendar 計算 startTime 和 endTime 之間的差異,發現 @"2008-02-28 00:00:00" 和 @"2022-02-28 00:00:00" 之間的差異和 @"2008 之間的差異-02-29 00:00:00" 和 @"2022-02-28 00:00:00" 相同。它看起來像 NSCalendar 的一個錯誤,可能是關于閏月?
代碼:
- (void)viewDidLoad
{
[super viewDidLoad];
[self printDiffBetweenStartTime:@"2008-02-27 00:00:00" endTime:@"2022-02-28 00:00:00"];
[self printDiffBetweenStartTime:@"2008-02-28 00:00:00" endTime:@"2022-02-28 00:00:00"];
[self printDiffBetweenStartTime:@"2008-02-29 00:00:00" endTime:@"2022-02-28 00:00:00"];
}
- (void)printDiffBetweenStartTime:(NSString *)startTime endTime:(NSString *)endTime
{
static NSDateFormatter *dateFormatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
dateFormatter.calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
});
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startDate = [dateFormatter dateFromString:startTime];
NSDate *endDate = [dateFormatter dateFromString:endTime];
NSCalendarUnit unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *components = [calendar components:unitFlags fromDate:startDate toDate:endDate options:0];
NSLog(@"\"%@\" to \"%@\" : %@ year %@ month %@ day %@ hour %@ minute %@ second", startTime, endTime, @(components.year), @(components.month), @(components.day), @(components.hour), @(components.minute), @(components.second));
}
輸出:
"2008-02-27 00:00:00" to "2022-02-28 00:00:00" : 14 year 0 month 1 day 0 hour 0 minute 0 second
"2008-02-28 00:00:00" to "2022-02-28 00:00:00" : 14 year 0 month 0 day 0 hour 0 minute 0 second
"2008-02-29 00:00:00" to "2022-02-28 00:00:00" : 14 year 0 month 0 day 0 hour 0 minute 0 second
uj5u.com熱心網友回復:
這是意料之中的。有很多方法可以進行這些周期計算,而NSCalendar使用的方法結果不是您所期望的。
該檔案簡要描述了它的作用:
一些操作可能是不明確的,并且計算的行為是特定于日歷的,但通常較大的組件將在較小的組件之前計算;例如,在公歷中,結果可能是 1 個月零 5 天,而不是 0 個月零 35 天。
這意味著它將首先計算兩個日期之間的年數,然后是月,然后是天,依此類推。“年”是您要求的最大組成部分。
并NSCalendar發現 2008-02-28 加上 14 年正好是 2022-02-28。2008-02-29 加上 14 年也正好是 2022-02-28,因為 2022 年不是閏年。請注意,“加一年”并不等于“加 12 個月”或“加 365 天”。
要在這種情況下出現差異,您需要先計算天數。一個周期有 5114 天,另一個有 5113 天。
再舉幾個例子:
如果您改為計算 2008-02-28 和 2022-02-01 之間的年、月、日期間,以及 2008-02-29 和 2022-02-01 之間的期間。您不會看到差異,兩者都是 13 年 11 個月和 4 天。這是因為在 2008-02-29 和 2008-02-28 上加上 13 年會得到 2021-02-28,然后加上 11 個月就是 2022-01-28。4 天后是 2022-02-01。
但是,如果只計算月和日,則 2008-02-28 和 2022-02-01 之間的時間段與 2008-02-29 和 2022-02-01 之間的時間段是不同的。
從 2008 年 2 月 28 日到 2022 年 2 月 1 日的期間為 167 個月零 4 天。2008-02-28 加上 167 個月就是 2022-01-28。4 天后是 2022-02-01。
2008 年 2 月 29 日至 2022 年 2 月 1 日之間的期間為 167 個月零3天。將 167 個月添加到 2008-02-29 是 2022-01-29。3 天后是 2022-02-01。
周期計算很奇怪,不是嗎!但它們以獨特的方式保持一致。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/513026.html
標籤:IOS目标-c斯卡伦达
