NSMutableArray に NSDates があり、一部の日付は同じ日からのものです。特定の日の NSDates の数を取得する最良の方法は何ですか?
編集:
申し訳ありませんが、私は完全に説明していません。ソース配列から特定の日の日付の数を取得するための何らかのロジックが必要です。したがって、配列をループして正確な日付を見つけ、同じ日の配列内の日数を知る必要があります。
NSMutableArray に NSDates があり、一部の日付は同じ日からのものです。特定の日の NSDates の数を取得する最良の方法は何ですか?
編集:
申し訳ありませんが、私は完全に説明していません。ソース配列から特定の日の日付の数を取得するための何らかのロジックが必要です。したがって、配列をループして正確な日付を見つけ、同じ日の配列内の日数を知る必要があります。
編集
NSDate *sourceDate = theDateThatYouAreLookingFor;
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone:[NSTimeZone systemTimeZone]];
NSDateComponents *dateComponents = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:sourceDate];
NSInteger day = [dateComponents day];
NSInteger month = [dateComponents month];
NSInteger year = [dateComponents year];
int count = 0;
//add check for existing dates on the same day
for(NSDate *checkDate in datesArray)
{
dateComponents = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:checkDate];
NSInteger checkDay = [dateComponents day];
NSInteger checkMonth = [dateComponents month];
NSInteger checkYear = [dateComponents year];
if(checkDay == day && checkMonth == month && checkYear == year)
count++;
}
//do something with count
編集終了
最も簡単な方法は、配列を反復処理し、NSDateFormatter を使用して各日付の日を文字列として比較することです。NSDateFormatters はコストがかかるため、プロセスを頻繁に実行したくないことに注意してください。
次のようなことができます。
NSMutableDictionary *dateInfo = [NSMutableDictionary dictionary];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.locale = [NSLocale currentLocale];
formatter.dateFormat = @"yyyyMMdd";
for(NSDate *date in datesArray)
{
NSString *dateStr = [formatter stringFromDate:date];
NSNumber *currentCount = [dateInfo objectForKey:dateStr];
if(currentCount)
{
//bump value
[dateInfo setObject:[NSNumber numberWithInt:currentCount.intValue + 1] forKey:dateStr];
}
else
{
[dateInfo setObject:[NSNumber numberWithInt:1] forKey:dateStr];
}
}
パフォーマンス上の理由から、「今日」(00:00:00) と「明日」(00:00:00) の 2 つの日付を作成します。これらの日付を比較の境界として使用します。日付が今日よりも大きく、明日よりも小さい場合、それは一致です。
NSDate 比較は基本的に double (プリミティブ型) 比較であるため、このメソッドは NSString オブジェクトまたは NSDateComponents を比較するよりも高速です。NSDateComponents を作成するには多くの計算が使用され、NSDateFormatters はおそらく NSDateComponents 自体を使用します。
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [[NSDateComponents alloc] init];
todayComponents.year = 2013;
todayComponents.month = 6;
todayComponents.day = 21;
// today must be at the beginning of your search day. i.e. 00:00:00
NSDate *today = [calendar dateFromComponents:todayComponents];
NSDateComponents *oneDayOffset = [[NSDateComponents alloc] init];
oneDayOffset.day = 1;
NSDate *tomorrow = [calendar dateByAddingComponents:oneDayOffset toDate:today options:0];
NSIndexSet *todaysIndexes = [array indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
if ([(NSDate *)obj compare:today] != NSOrderedAscending && [(NSDate *)obj compare:tomorrow] == NSOrderedAscending) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ obj is not earlier than "today" (= same time or later)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ obj is earlier than "tomorrow"
return YES;
}
return NO;
}];
NSLog(@"%d", [todaysIndexes count]);
今日を検索日 (真夜中) に置き換えれば、準備完了です。