1

Objective-Cで日付を比較するのはこれが初めてです。私はしばらくの間Webを検索していて、見つけたすべての例は文字列からNSDateを構築することを含んでいるので、ここで新しい質問をすることにしました...私の質問は次のとおりです。

時間を無視して、2つのNSDateが同じ日にあるかどうかを知る必要があります。日付のセットを含む2つの'を取得NSArrayし、1つずつ、最初の配列のどちらNSArrayが2番目の配列と同じ日にあるかを判別する必要があります。

- (void)setActiveDaysColor:(UIColor *)activeDaysColor
{
    for (DayView *actualDay in _days)
    {
        NSDate *actualDayDate = [actualDay date];

        for (NSDate *activeDayDate in self.dates)
        {
            // Comparison code
            // If both dates are the same, tint actualDay with a different color
        }
    }
}

よろしくお願いします。良い一日を。

アレックス。

4

5 に答える 5

10

時間コンポーネントを省略して、新しい日付を作成します。比較方法の1つを使用します

NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger components = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);

NSDateComponents *firstComponents = [calendar components:components fromDate:firstDate];
NSDateComponents *secondComponents = [calendar components:components fromDate:secondDate];

NSDate *date1 = [calendar dateFromComponents:firstComponents];
NSDate *date2 = [calendar dateFromComponents:secondComponents];

NSComparisonResult result = [date1 compare:date2];
if (result == NSOrderedAscending) {
} else if (result == NSOrderedDescending) {
}  else {
}
于 2012-05-24T08:07:22.017 に答える
2
-(BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 {
NSCalendar* calendar = [NSCalendar currentCalendar];

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];

return [comp1 day]   == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year]  == [comp2 year];}
于 2012-12-24T06:24:06.423 に答える
1

NSDateのドキュメントを確認してください。これらは日付を比較する方法です。

  • isEqualToDate
  • EarlyDate
  • 後日
  • 比較

あなたの場合

if([actualDayDate isEqualToDate:activeDayDate])
{

}
于 2012-05-24T08:07:39.303 に答える
1

すべての回答をありがとう。まったく関係のない投稿で答えられた私の質問に対するより明確な答えを見つけましたが、それは実際には完全に機能します。

if ((unsigned int)[actualDayDate timeIntervalSinceDate:activeDayDate] / 60 / 60 / 24 == 0)
{
     // do Stuff
}
于 2012-05-24T08:36:08.850 に答える
1

コード内にあるループの代わりに、述語を使用して、現在のすべてのオブジェクトをフィルターで除外することができます。今日の日付を除外するには、それを今日の初めと今日の終わりと比較します。

このように、任意のNSDateをその日付の先頭に設定できます(この回答を参照)

NSDate *beginDate = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginDate interval:NULL forDate:beginDate];

次に、終了日を取得するには、それに1日を追加するだけです。秒数を計算して日数を加算しないでください。これは夏時間では機能しません!このようにしてください(この回答も参照してください):

NSDateComponents *oneDay = [[NSDateComponents alloc] init];
[oneDay setDay:1];
// one day after begin date
NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:oneDay toDate:beginDate options:0];

今日の範囲を定義する2つの日付ができたので、NSPredicateを使用してすべてのDayViewをフィルタリングし、次のように、今日のすべてのDayViewの新しい配列を取得できます(この回答を参照)。

// filter DayViews to only include those where the day is today
NSArray *daysThatAreToday = [_days filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", beginDate, endDate]];

これで、新しい配列(今日のDayViewを含む)を列挙することにより、すべてのDayViewに色合いの色を適用できます。

[daysThatAreToday enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    // Set the tint color here...
}];

私の意見では、これはクリーンですが、より重要なことに、問題を解決する正しい方法です。それは明確に読み、夏時間と他のカレンダー、そしてグレゴリオ暦を処理します。また、特定の週(または他の期間)のすべてのDayViewに色を付けたい場合は、簡単に再利用できます。

于 2012-05-24T09:37:19.227 に答える