1

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

我需要知道两个 NSDate 是否在同一天,忽略时间。我得到了两个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
        }
    }
}

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

亚历克斯。

4

5 回答 5

10

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

例子

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

感谢您的所有回答。我在一篇完全不相关的帖子中找到了对我的问题的更清晰的答案,但实际上效果很好。

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

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

  • isEqualToDate
  • 较早日期
  • 稍后日期
  • 相比

在你的情况下

if([actualDayDate isEqualToDate:activeDayDate])
{

}
于 2012-05-24T08:07:39.303 回答
1

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

您可以像这样将任何 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,以获取今天是今天的所有 DayViews 的新数组,如下所示(请参阅此答案):

// 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 着色,它也可以很容易地重复使用。

于 2012-05-24T09:37:19.227 回答