【问题标题】:How to find missing days from an array of NSDates?如何从 NSDates 数组中查找缺失的日期?
【发布时间】:2013-01-10 19:42:30
【问题描述】:

我有一个有序 NSDates 的 NSMutableArray。我正在寻找一种方法,它返回数组中最早日期和现在之间原始数组中缺少的所有天数(以 NSDate 形式)。在检查相等性时,我只关心 NSDate 的年、月和日部分。例如:

NSMutableArray *missingDates;
for (NSDate *date in allDatesBetweenOldestDateAndNow){
    if (date isNotIn: myDates)
        [missingDates addObject:date];
return missingDates;

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 请记住,如果它是一个有序数组,您只需要确定数组中两个相邻的日期是否是相邻的日期。

标签: ios objective-c nsmutablearray nsdate


【解决方案1】:

我建议使用NSDateComponents,Apple 有一个guide 来使用它们。

This guide by Apple 解释了如何计算日期NSDateComponents 以执行与您类似的任务。

【讨论】:

  • 再补充一点,NSDate 是一个独特的时刻和时间。它的年月日将完全取决于语言环境,这就是为什么你需要使用 NSDateComponents 来做你想做的事情。
  • @HotLicks - 这是一个错误的工作工具。 NSDateFormatter 旨在创建日期的字符串表示形式,而不是用于进行日期计算。是的,你可以让它工作,但你在找边缘情况等问题。
  • @HotLicks - 如果他们知道,我会告诉你 :) 无论如何,你为什么宁愿使用日期格式化程序而不是 NSDateComponents?
  • 上次我使用NSDateFormatter 时性能远不如使用NSDateComponents。由于该问题与查看日期列表有关,并且该列表可能很大,因此使用我认为具有最佳性能而不是最少代码的选项来回答。从那以后性能可能有所提高,但我在使用 iOS 5.0 时遇到了这个问题
  • @DBD - 如果您为每次迭代创建一个新的格式化程序,我相信。
【解决方案2】:

您可能需要继承NSDate 并添加一个比较日期而不考虑时间的方法:

- (BOOL) isEqual:(id)object
{
    NSDateComponents* c1= [[NSCalendar currentCalendar]  components: NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate: self ];
    NSDateComponents* c2= [[NSCalendar currentCalendar]  components: NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate: object ];
    return [c1 isEqual: c2];
}

剩下的就很自然了:要查看你的数组是否有日期,你可以使用这个方法。

【讨论】:

  • 这不会告诉你他们是否相隔一天。
  • 这是针对“if (date isNotIn: myDates)”部分的:如果他有一个自定义 NSDate 对象数组,其中 isEqual: 被覆盖,他可以知道一个对象是否在数组中, 使用 containsObject: .
  • 那么你怎么知道缺少哪些日期?
  • 我认为的算法是:在两个日期之间创建一个日期数组,并消除他的日期数组中的每个日期。你是对的,如果你认为它没有效率,你会做得更好。 +1。
【解决方案3】:

未编译 -- 可能有一些 tupos。

NSDateFormatter* dayFmt = [[NSDateFormatter alloc] init];
[dayFmt setTimeZone:<whatever time zone you want>];
[dayFmt setDateFormat:@"g"];
NSInteger lastDay = [[dayFmt stringFromDate:startDate] integerValue];
// Note:  We assume that myDates is sorted, as stated.
for (NSDate* myDate in myDates) {
    NSInteger myDay = [[dayFmt stringFromDate:myDate] integerValue];
    while (myDay > lastDay+1) {
        lastDay++;
        NSDate* newDate = [dayFmt dateFromString:[NSString stringWithFormat:@"%d", lastDay]];
        [missingDates addObject:newDate];
    }
}

(我将把它留作练习,让用户弄清楚如何填写最后一个数组条目和某个任意结束日期之间的任何缺失日期。)

(还应注意,代码假定数组中没有重复的日期。处理起来很容易,但对用户来说是另一个练习。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多