如何比较Objective-C中的两个日期

Raj*_*aju 68 cocoa date objective-c date-comparison

我有两个日期:2009-05-11和当前日期.我想检查给定日期是否是当前日期.这怎么可能.

ste*_*anB 156

Cocoa有几种方法:

在NSDate

– isEqualToDate:  
– earlierDate:  
– laterDate:  
– compare:
Run Code Online (Sandbox Code Playgroud)

当你使用时- (NSComparisonResult)compare:(NSDate *)anotherDate,你会回来其中一个:

The receiver and anotherDate are exactly equal to each other, NSOrderedSame
The receiver is later in time than anotherDate, NSOrderedDescending
The receiver is earlier in time than anotherDate, NSOrderedAscending.
Run Code Online (Sandbox Code Playgroud)

例:

NSDate * now = [NSDate date];
NSDate * mile = [[NSDate alloc] initWithString:@"2001-03-24 10:45:32 +0600"];
NSComparisonResult result = [now compare:mile];

NSLog(@"%@", now);
NSLog(@"%@", mile);

switch (result)
{
    case NSOrderedAscending: NSLog(@"%@ is in future from %@", mile, now); break;
    case NSOrderedDescending: NSLog(@"%@ is in past from %@", mile, now); break;
    case NSOrderedSame: NSLog(@"%@ is the same as %@", mile, now); break;
    default: NSLog(@"erorr dates %@, %@", mile, now); break;
}

[mile release];
Run Code Online (Sandbox Code Playgroud)


Nav*_*afi 44

伙计.此功能将使您的日期与任何指定日期相匹配,并告知它们匹配与否的天气.您还可以修改组件以符合您的要求.

- (BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 {
NSCalendar* calendar = [NSCalendar currentCalendar];

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];

return [comp1 day]   == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year]  == [comp2 year];}
Run Code Online (Sandbox Code Playgroud)

此致,Naveed Butt

  • 这是正确的答案.虽然最佳答案可能更为一般,但这提供了针对所提出问题的特定解决方案. (3认同)
  • 刚刚好!!正在尝试这种方法的几种方法 (2认同)
  • 很棒的答案.谢谢 (2认同)
  • @Naveed Rafi这是我在StackOverflow上看到的最准确和最有用的答案,这两年我很享受它的服务. (2认同)

小智 40

NSDate *today = [NSDate date]; // it will give you current date
NSDate *newDate = [NSDate dateWithString:@"xxxxxx"]; // your date 

NSComparisonResult result; 
//has three possible values: NSOrderedSame,NSOrderedDescending, NSOrderedAscending

result = [today compare:newDate]; // comparing two dates

if(result==NSOrderedAscending)
    NSLog(@"today is less");
else if(result==NSOrderedDescending)
    NSLog(@"newDate is less");
else
    NSLog(@"Both dates are same");
Run Code Online (Sandbox Code Playgroud)

您可以使用其他方法来比较NSDate对象.在某些任务中,每种方法都会更有效.我选择了比较方法,因为它可以处理大多数基本日期比较需求.


Pas*_*cal 32

类别提供了一种比较NSDates的简洁方法:

#import <Foundation/Foundation.h>

@interface NSDate (Compare)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
//- (BOOL)isEqualToDate:(NSDate *)date; already part of the NSDate API

@end
Run Code Online (Sandbox Code Playgroud)

并实施:

#import "NSDate+Compare.h"

@implementation NSDate (Compare)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedAscending);
}

-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedDescending);
}
-(BOOL) isLaterThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedDescending);

}
-(BOOL) isEarlierThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedAscending);
}

@end
Run Code Online (Sandbox Code Playgroud)

使用简单:

if([aDateYouWantToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now
{
    // do your thing ...
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*ski 22

如果你把两个日期NSDate是你可以使用NSDatecompare:方法:

NSComparisonResult result = [Date2 compare:Date1];

if(result==NSOrderedAscending)
    NSLog(@"Date1 is in the future");
else if(result==NSOrderedDescending)
    NSLog(@"Date1 is in the past");
else
    NSLog(@"Both dates are the same");
Run Code Online (Sandbox Code Playgroud)

您可以在这里查看文档.


小智 15

通过这种方法,您还可以比较两个日期

NSDate * dateOne = [NSDate date];
NSDate * dateTwo = [NSDate date];

if([dateOne compare:dateTwo] == NSOrderedAscending)
{

}
Run Code Online (Sandbox Code Playgroud)

  • 与之比较的有趣常量可能是:`NSOrderedAscending`,`NSOrderedSame`和`NSOrderedDescending`,但OP可能想要'NSOrderedSame`来解决他的特定问题. (2认同)

Che*_*hei 8

我找到的最好的方法是检查给定日期和今天之间的差异:

NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* now = [NSDate date];
int differenceInDays =
[calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:date] -
[calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:now];
Run Code Online (Sandbox Code Playgroud)

根据Apple 日期和时间编程指南中Calendrical Calculations清单13 [NSCalendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:myDate]为您提供自该时代开始以来的午夜数.通过这种方式,可以轻松检查日期是昨天,今天还是明天.

switch (differenceInDays) {
    case -1:
        dayString = @"Yesterday";
        break;
    case 0:
        dayString = @"Today";
        break;
    case 1:
        dayString = @"Tomorrow";
        break;
    default: {
        NSDateFormatter* dayFormatter = [[NSDateFormatter alloc] init];
        [dayFormatter setLocale:usLocale];
        [dayFormatter setDateFormat:@"dd MMM"];
        dayString = [dayFormatter stringFromDate: date];
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)


iph*_*v23 5

NSDateFormatter *df= [[NSDateFormatter alloc] init];

[df setDateFormat:@"yyyy-MM-dd"];

NSDate *dt1 = [[NSDate alloc] init];

NSDate *dt2 = [[NSDate alloc] init];

dt1=[df dateFromString:@"2011-02-25"];

dt2=[df dateFromString:@"2011-03-25"];

NSComparisonResult result = [dt1 compare:dt2];

switch (result)
{

        case NSOrderedAscending: NSLog(@"%@ is greater than %@", dt2, dt1); break;

        case NSOrderedDescending: NSLog(@"%@ is less %@", dt2, dt1); break;

        case NSOrderedSame: NSLog(@"%@ is equal to %@", dt2, dt1); break;

        default: NSLog(@"erorr dates %@, %@", dt2, dt1); break;

}
Run Code Online (Sandbox Code Playgroud)

享受编码......


Dav*_*zer 2

你真正需要的是比较两个同类的对象。

  1. 从字符串日期 (@"2009-05-11") 创建一个 NSDate :
    http://blog.evandavey.com/2008/12/how-to-convert-a-string-to-nsdate.html

  2. 如果当前日期也是字符串,则将其设为 NSDate。如果它已经是 NSDate,请保留它。

  • 您不能使用 == 来比较两个对象 (3认同)