两个 NSDate 之间的日期比较



这是我第一次在Objective-C中比较日期。我已经在网上搜索了一段时间,我发现的所有示例都涉及从字符串构建 NSDate,所以我决定在这里问一个新问题......我的问题如下:

我需要知道两个 NSD 是否在同一天,忽略时间。我得到了两个包含一组日期的NSArray,我需要逐个确定第一个NSArray中的哪一个与第二个数组中的日期在同一天。

- (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
        }
    }
}

提前谢谢你,祝你有美好的一天。

亚历克斯。

通过省略时间部分来创建新日期。 并使用其中一种比较方法

  • 更早日期:
  • 后来日期:
  • 比较:
  • isEqualToDate

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 {
}
-(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];}

查看 NSDate 文档,这些是比较日期的方法

  • isEqualToDate
  • 更早日期
  • 后来日期
  • 比较

在您的情况下

if([actualDayDate isEqualToDate:activeDayDate])
{
}

感谢您的所有回答。我在一个完全不相关的帖子中找到了一个更清晰的问题的答案,但这实际上非常有效。

if ((unsigned int)[actualDayDate timeIntervalSinceDate:activeDayDate] / 60 / 60 / 24 == 0)
{
     // do Stuff
}
除了代码

中的循环之外,您可以使用谓词来过滤掉当前的所有对象。通过将其与今天的开始和今天的结束进行比较来过滤掉今天的日期。

您可以像这样将任何 NSDate 设置为该日期的开头(请参阅此答案)

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

然后,要获得结束日期,您只需在其中添加一天即可。不要通过计算秒数来添加天数。这不适用于夏令时!这样做(另请参阅此答案):

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

现在您已经有了定义今天范围的两个日期,您可以使用 NSPredicate 过滤所有 DayViews,以获取今天一天的所有 DayView 的新数组,如下所示(请参阅此答案):

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

现在,您可以通过枚举新数组(包含今天的 DayViews)将色调颜色应用于所有 DayViews。

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

在我看来,这是一种干净但更重要的是解决问题的正确方法。它读起来很清楚,可以处理夏令时和其他日历,然后是公历。如果您想为特定周(或任何其他时间段)的所有 DayView 着色,它也可以轻松重复使用。

最新更新