Iphone 如何比较NSDates以查找数组中最早和最晚的日期?

Iphone 如何比较NSDates以查找数组中最早和最晚的日期?,iphone,objective-c,nsdate,Iphone,Objective C,Nsdate,确定数组中最早日期和最晚日期的代码有很多问题。以下是我正在使用的代码: NSDate *startDate = nil; // Earliest date NSDate *endDate = nil; // Latest date for (id entry in myArray) { NSDate *date = [entry objectForKey:kDate]; if (startDate == nil && endDate == nil)

确定数组中最早日期和最晚日期的代码有很多问题。以下是我正在使用的代码:

NSDate *startDate = nil; // Earliest date
NSDate *endDate = nil; // Latest date

for (id entry in myArray) 
{
    NSDate *date = [entry objectForKey:kDate];

    if (startDate == nil && endDate == nil) 
    {
        startDate = date;
        endDate = date;
    }
    else if ([date compare:endDate] == NSOrderedAscending)
    {
        startDate = date;
    }
    else if ([date compare:startDate] == NSOrderedDescending)
    {
        endDate = date;
    }

    date = nil;
}

有人能帮我找出哪里出了问题吗?

你肯定是在
语句中设置了
startDate
endDate
错误的方向吗?你不想要这个吗:

NSDate *startDate = nil; // Earliest date
NSDate *endDate = nil; // Latest date

for (id entry in myArray) 
{
    NSDate *date = [entry objectForKey:kDate];

    if (startDate == nil && endDate == nil) 
    {
        startDate = date;
        endDate = date;
    }
    if ([date compare:startDate] == NSOrderedAscending)
    {
        startDate = date;
    }
    if ([date compare:endDate] == NSOrderedDescending)
    {
        endDate = date;
    }

    date = nil;
}

您还可以使用以下方法对
NSArray
进行排序
NSDates

array = [array sortedArrayUsingSelector:@selector(compare:)];

然后在
[array firstObject]
将是第一个日期(例如1970-01-01T00:00:00),最后一个对象:
[array lastObject]
将是最后一个日期:(例如2011-01-12T00:00:00)

您也可以使用预定义的和常量来避免额外检查
nil

NSDate *startDate = [NSDate distantFuture];
NSDate *endDate = [NSDate distantPast];

for (id entry in myArray)
{
    NSDate *date = [entry objectForKey:kDate];

    if ([date compare:startDate] == NSOrderedAscending) { startDate = date; }
    if ([date compare:endDate] == NSOrderedDescending)  { endDate = date; }

    date = nil;
}

您还可以使用
earlierDate:
laterDate:
NSDate函数

NSDate *startDate = [NSDate distantFuture]; NSDate *endDate = [NSDate distantPast]; for (id entry in myArray) { NSDate *date = [entry objectForKey:kDate]; startDate = [startDate earlierDate:date]; endDate = [endDate laterDate:date]; } NSDate*startDate=[NSDate distantFuture]; NSDate*endDate=[NSDate distantpass]; for(myArray中的id条目) { NSDate*date=[entry objectForKey:kDate]; startDate=[startDate earlierDate:date]; endDate=[endDate laterDate:date]; }
仅针对其他类似问题:
valueForKeyPath:
选项非常简洁,我认为:

[myArray valueForKeyPath:@"@min.self"];
[myArray valueForKeyPath:@"@max.self"];

这假设数组中的对象按照您想要的方式实现
compare:
方法。例如,我使用它来获取日期数组中最早的日期。如果您想在此处使用它,数组中的对象应该覆盖
比较:
方法。

使用标准算法来细化数组中的最小/最大值,可以找到最早的日期:

NSMutableArray<NSDate *> *allDates; // dates array
NSDate *earliestDate = allDates.firstObject;
        for (NSDate *date in allDates) {
            if ([date compare:earliestDate] == NSOrderedAscending) {
                earliestDate = date;
            }
        }
NSMutableArray*allDates;//日期数组
NSDate*earliestDate=allDates.firstObject;
用于(NSDate*所有日期中的日期){
如果([日期比较:earliestDate]==传感器解除扫描){
earliestDate=日期;
}
}

要查找数组中的最新日期,请使用
sensorderedescending
而不是
sensorderedescending

,因为将
date
endDate
进行比较与将
date
startDate
进行比较的结果没有任何关系,您还必须删除
否则
。也许两个都要去掉。是的,我完全掩盖了这一点。相应地进行了编辑。请重新考虑,然后将
其他
重新放入。(
date
不能同时在
endDate
之后和
startDate
之前)