通过将日期与日历日期进行比较来加载即将发生的事件

Posted

技术标签:

【中文标题】通过将日期与日历日期进行比较来加载即将发生的事件【英文标题】:loading upcoming events by comparing their dates with the calendar date 【发布时间】:2014-02-06 00:22:28 【问题描述】:

我在网上找到了以下代码,用于比较两个日期(日历的日期和另一个日期)我想要帮助的是修改此代码,以便它将日历日期与日期所在的事件的日期进行比较这是 NSArray (json 文件)中每个事件的关键.. 还有我以后如何将它与 NSPredicate 一起使用,以便我可以只加载带有组件的事件(两个日期之间的天数差异),因为我去的时间至少超过 1 天当用户单击 UIButton 调用未来事件时,应该加载所有未来事件。我非常感谢任何帮助和代码示例,因为我对目标 C 和 Xcode 非常陌生。谢谢。

@implementation HomeViewController 
    NSArray *_events;


- (BOOL)isSameDay:(NSDate*)date

    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSDate *currDate = [NSDate date];
    //date = [_events objectAtIndex:date];

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date];
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:currDate];
    NSDateComponents *components = [calendar components:unitFlags
                                               fromDate:currDate
                                                 toDate:date
                                                options:0];

    NSLog(@"Days between dates: %@", components);

    return [comp1 day]   == [comp2 day] &&
    [comp1 month] == [comp2 month] &&
    [comp1 year]  == [comp2 year];

【问题讨论】:

【参考方案1】:

要获取某个日期从现在开始的剩余天数,可以使用以下方法:

-(long)daysRemaining:(NSDate*) date

    NSDate *now = [NSDate date];
    NSTimeInterval dateDiff = [date timeIntervalSinceNow] - [now timeIntervalSinceNow];
    CGFloat numberOfDaysRemaining = (dateDiff/(60*60*24));
    return ceil(numberOfDaysRemaining);

所以你可以像这样调用来获取剩余天数:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *dateToCompare = [dateFormatter dateFromString: @"2014-02-08"];

long numberDays = [self daysRemaining:dateToCompare];

对于这种情况,结果是剩余 2 天。请注意,否定结果表示已过去 n 天。

要过滤数组(剩余 2 天的事件)并复制它:

NSArray* dates = [[NSArray alloc] initWithObjects:
    [dateFormatter dateFromString: @"2014-02-08"],
    [dateFormatter dateFromString: @"2014-02-05"],
    [dateFormatter dateFromString: @"2014-02-10"],
    [dateFormatter dateFromString: @"2014-02-08"], nil];

NSArray *filteredArray = [dates filteredArrayUsingPredicate:
    [NSPredicate predicateWithBlock:
        ^BOOL(id evaluatedObject, NSDictionary *bindings) 
            long daysRemaining = [self daysRemaining:(NSDate*)evaluatedObject];
            return daysRemaining == 2; // if someMethod returns YES, the object is kept
        
    ]];

就地过滤 NSMutableArray:

[mutableArray filterUsingPredicate:[NSPredicate predicateWithBlock:
    ^BOOL(id evaluatedObject, NSDictionary *bindings) 
        long daysRemaining = [self daysRemaining:(NSDate*)evaluatedObject];
        return daysRemaining == 2; // if someMethod returns YES, the object is kept
    
]];

【讨论】:

谢谢Felipe,所以你说我必须将所有这些代码添加到我的程序中,以便Future UIButton 加载未来的事件??所以不需要使用 NSCalendar 或 components:fromDate:toDate:options:0 函数??我不明白你为什么要返回 daysRemaining == 2 ?就我而言,我认为它应该是 1 或更大!!.. Future UIButton 需要加载数据(如果尚未加载),然后使用谓词代码对其进行过滤。如果您有 NSDate 对象或日期字符串,则不需要使用 NSCalendar。要过滤所有未来的事件,正确的是 return (daysRemaining > 0)。因此,如果是未来事件,则条件将返回 YES,并且将列出该事件。 好的,我明白了,但我现在有问题,我该如何修改它,以便它可以在我的 json 文件中包含每个事件的日期键 --> NSDate *dateToCompare = [dateFormatter dateFromString: @" 2014-02-08"];还有这行代码中 now 的值是什么 --> NSDate *now = [NSDate date]; ^BOOL(id evaluateObject, NSDictionary *bindings) 中的 --> (id evaluateObject) 是什么意思?? 也许你有一个可以解析成字典数组的json文件,其中数组中的每个字典元素都是一个事件,字典中的每个元素都是事件的属性,其中一个属性必须是日期。虽然这个属性是一个字符串,但是你可以在 Predicate 的代码块中使用 [dateFormatter dateFromString: StringProperty] 方法解析成 NSDate。 ^BOOL(id evaluateObject, NSDictionary *bindings) 是为数组中的每个元素调用的代码块,将元素传递到评估对象并接收一个布尔值,指示该元素是否存在包含在过滤后的数组中。因此,对剩余天数 0 表示“是”,表示谓词可以维护该元素。【参考方案2】:
  [displayedEvents addObjectsFromArray:[_events filteredArrayUsingPredicate:
                          [NSPredicate predicateWithBlock:
                           ^BOOL(Events * event, NSDictionary *bindings) 
                               [dateFormatter dateFromString: event.date];
                               long daysRemaining = [self daysRemaining: (NSDate*)event.date];
                               return daysRemaining > 1; // if someMethod returns YES, the object is kept
                           
  ]]];

【讨论】:

以上是关于通过将日期与日历日期进行比较来加载即将发生的事件的主要内容,如果未能解决你的问题,请参考以下文章

php 即将发生的事件 - 将日期转换为整数

如何在 Google 日历 API v3 中获取特定日期的日历数据?

将事件日期从UIWebView同步到手机日历

我想从数据库加载事件日历,返回值失效且日期不显示

如何将 Fullcalendar 插件中的日期与日期数组进行比较

通过将日期列与两个参考列进行比较来计算从日期开始的年期