iOS:比较两个日期

时间:2011-05-24 14:31:21

标签: objective-c ios nsdate

我有NSDate我必须与其他两个NSDate进行比较,我尝试使用NSOrderAscendingNSOrderDescending,但如果我的日期在其他两个日期相同吗?< / p>

示例:如果我有一个myDate = 24/05/2011和另外两个一个= 24/05/2011和两个24/05/2011我可以使用哪个?

6 个答案:

答案 0 :(得分:210)

根据Apple documentation of NSDate compare:

  

返回NSComparisonResult值,该值指示接收方的时间顺序和另一个给定日期。

     

- (NSComparisonResult)compare:(NSDate *)anotherDate

     

参数 anotherDate

     

比较日期   接收器。该值不得为零。   如果值为nil,则行为为   未定义,将来可能会改变   Mac OS X的版本。

     

返回值

     

如果:

     

接收者和另一个日子是   完全相同,   的 NSOrderedSame

     

接收器晚些时候进入   时间比另一个日期,   的 NSOrderedDescending

     

接收器是   比其他日期早,   的 NSOrderedAscending

换句话说:

if ([date1 compare:date2] == NSOrderedSame) ...

请注意,在您的特定情况下,读取和写入它可能更容易:

if ([date2 isEqualToDate:date2]) ...

请参阅Apple Documentation about this one

答案 1 :(得分:32)

在搜索了stackoverflow和网络之后,我得知,最好的方法就是这样:

- (BOOL)isEndDateIsSmallerThanCurrent:(NSDate *)checkEndDate
{
    NSDate* enddate = checkEndDate;
    NSDate* currentdate = [NSDate date];
    NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate];
    double secondsInMinute = 60;
    NSInteger secondsBetweenDates = distanceBetweenDates / secondsInMinute;

    if (secondsBetweenDates == 0)
        return YES;
    else if (secondsBetweenDates < 0)
        return YES;
    else
        return NO;
}

您也可以将其更改为小时数之间的差异。

享受!


编辑1

如果您只想将日期与dd / MM / yyyy的格式进行比较,则需要在NSDate* currentdate = [NSDate date];&amp;&amp;之间添加以下行。 NSTimeInterval distance

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]
                          autorelease]];

NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]];

currentdate = [dateFormatter dateFromString:stringDate];

答案 2 :(得分:23)

我认为你在询问比较函数中的返回值是什么。

如果日期相同,则返回NSOrderedSame

如果升序(第二个arg&gt;第一个arg)返回NSOrderedAscending

如果下降(第二个arg&lt; 1st arg)返回NSOrderedDescending

答案 3 :(得分:16)

我不知道您是否已经问过这个问题但是如果您只想比较NSDate的日期组件,则必须使用NSCalendar和NSDateComponents来删除时间组件。

这样的东西应该作为NSDate的一个类别:

- (NSComparisonResult)compareDateOnly:(NSDate *)otherDate {
    NSUInteger dateFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit;
    NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents *selfComponents = [gregorianCalendar components:dateFlags fromDate:self];
    NSDate *selfDateOnly = [gregorianCalendar dateFromComponents:selfComponents];

    NSDateComponents *otherCompents = [gregorianCalendar components:dateFlags fromDate:otherDate];
    NSDate *otherDateOnly = [gregorianCalendar dateFromComponents:otherCompents];
    return [selfDateOnly compare:otherDateOnly];
}

答案 4 :(得分:2)

NSDate实际上表示自参考日期(我认为2000年1月1日UTC)以来的秒数时间间隔。在内部,使用双精度浮点数,因此即使它们在同一天,两个任意日期也不太可能相等。如果您想查看特定日期是否属于特定日期,则可能需要使用NSDateComponents。例如

NSDateComponents* dateComponents = [[NSDateComponents alloc] init];
[dateComponents setYear: 2011];
[dateComponents setMonth: 5];
[dateComponents setDay: 24];
/*
 *  Construct two dates that bracket the day you are checking.  
 *  Use the user's current calendar.  I think this takes care of things like daylight saving time.
 */
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* startOfDate = [calendar dateFromComponents: dateComponents];
NSDateComponents* oneDay = [[NSDateComponents alloc] init];
[oneDay setDay: 1];
NSDate* endOfDate = [calendar dateByAddingComponents: oneDay toDate: startOfDate options: 0];
/*
 *  Compare the date with the start of the day and the end of the day.
 */
NSComparisonResult startCompare = [startOfDate compare: myDate];
NSComparisonResult endCompare = [endOfDate compare: myDate];

if (startCompare != NSOrderedDescending && endCompare == NSOrderedDescending)
{
    // we are on the right date
} 

答案 5 :(得分:2)

首先检查以下函数的日期比较,创建两个NSDate对象并传递给函数: 在viewDidload中或根据您的场景添加下面的代码行。

-(void)testDateComaparFunc{

NSString *getTokon_Time1 = @"2016-05-31 03:19:05 +0000";
NSString *getTokon_Time2 = @"2016-05-31 03:18:05 +0000";
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss Z"];
NSDate *tokonExpireDate1=[dateFormatter dateFromString:getTokon_Time1];
NSDate *tokonExpireDate2=[dateFormatter dateFromString:getTokon_Time2];
BOOL isTokonValid = [self dateComparision:tokonExpireDate1 andDate2:tokonExpireDate2];}

这是函数

-(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{

BOOL isTokonValid;

if ([date1 compare:date2] == NSOrderedDescending) {
    //"date1 is later than date2
    isTokonValid = YES;
} else if ([date1 compare:date2] == NSOrderedAscending) {
    //date1 is earlier than date2
    isTokonValid = NO;
} else {
   //dates are the same
    isTokonValid = NO;

}

return isTokonValid;}

只需更改日期并测试以上功能:)