UITableView に表示している一連のイベントを取得しました。各イベントには開始日と終了日があり、その間に 1 ~ 3 日あります。
特定の日付範囲に月の始まり (例: 8 月 1 日) が含まれているかどうかを検出し、そのテーブル ビュー セルに特別なマーカーを追加しようとしています。
NSDate とカレンダーの操作は高価な操作であり、私のテーブル ビューは既に世界最速ではないことを読みました。日付範囲に月の始まりが含まれているかどうかを効率的に判断するにはどうすればよいですか?
UITableView に表示している一連のイベントを取得しました。各イベントには開始日と終了日があり、その間に 1 ~ 3 日あります。
特定の日付範囲に月の始まり (例: 8 月 1 日) が含まれているかどうかを検出し、そのテーブル ビュー セルに特別なマーカーを追加しようとしています。
NSDate とカレンダーの操作は高価な操作であり、私のテーブル ビューは既に世界最速ではないことを読みました。日付範囲に月の始まりが含まれているかどうかを効率的に判断するにはどうすればよいですか?
さて、実用的に考えると、各日付の月を確認できます。
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* startComp = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:startDate];
NSDateComponents* endComp = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:endDate];
if([startComp month] != [endComp month]){
// start of month included
}
日についても同じことができます。endDate
日の値が日の値よりも少ない場合はstartDate
、どこかに1位があることがわかります。明らかに、この方法は、イベントが1か月未満に及ぶ場合にのみ適切に機能します(あなたが言ったように)。
終了日が開始日より前かどうかを確認できます。
例: 開始 = 6 月 30 日、終了 = 7 月 2 日。
NSDate * start, end;
NSInteger startDay = [[start descriptionWithCalendarFormat:@"%d" timeZone:nil locale:nil] intValue];
NSInteger endDay = [[start descriptionWithCalendarFormat:@"%d" timeZone:nil locale:nil] intValue];
if (endDay < startDay) {
// bingo!
}
2 つの終了日の月の値を確認してください。それらが異なる場合は、月の始まりがあります。それ以外の場合は違います。
編集:最初にエンドポイント(開始または終了)の日付の値が1であることを確認してください。