iOS:比较两个日期


96

我有一个NSDate,我必须和另外两个比较NSDate,我试着用NSOrderAscendingNSOrderDescending,但如果我的日期是在其他两个日期平等吗?

例如:如果我有一个myDate = 24/05/2011 和另外两个分别是一个= 24/05/2011和两个24/05/2011,我该怎么用?


1
我不完全理解您的问题,您要达到什么目的?
arclight 2011年

日期1和日期2可以是1 = 15/05/2011和2 = 31/05/2011,但它们也必须是同一天1 = 24/05/2011和2 = 24/05/2011,那么我必须检查MYDATA的是beetween日期和一个日起二
cyclingIsBetter

只需提取年,月和日,然后按该顺序进行比较即可。如果有平局,则比较下一个字段。
Himadri Choudhury

Answers:


210

根据苹果的文件NSDate compare:

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

- (NSComparisonResult)compare:(NSDate *)anotherDate

参量 anotherDate

比较接收者的日期。此值不能为nil。如果值为nil,则行为是不确定的,并且在Mac OS X的将来版本中可能会更改。

返回值

如果:

接收者和anotherDate彼此完全相同, NSOrderedSame

接收器的时间晚于另一个日期, NSOrderedDescending

接收者的时间早于另一个日期, NSOrderedAscending

换一种说法:

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

请注意,在您的特定情况下,阅读和编​​写以下内容可能会更容易:

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

有关此内容,请参阅Apple文档


但是f([date1 compare:date2] == NSOrderedSame)还要检查小时分钟和秒数,而我不想要它
CycleIsBetter 2011年

1
您的问题有点不清楚,抱歉,请看一下stackoverflow.com/questions/1889164/3092009#3092009,您将找到答案。
Vincent Guerci 2011年

这个答案在两个方面都是正确的。要控制您要比较的日期组件,请使用NSDateComponents
-Nazir

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];&& 之间添加以下行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];

1
由于这个工程优于比较或isEqualToDate
ArdenDev

同意 我发现使用compare&isEqualToDate存在问题。当然,这可能是额外的两行代码,但是更可靠。
Roebuck教练

23

我想你是在问比较函数中的返回值是多少。

如果日期相等,则返回 NSOrderedSame

如果升序(2 arg> 1 arg)返回 NSOrderedAscending

如果降序(2 arg <1 arg)返回 NSOrderedDescending


思考上升和下降的好方法。
大卫,

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];
}

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
} 

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;}

只需更改日期并测试上述功能即可:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.