2009-06-04 4 views
60

У меня есть две даты: 2009-05-11 и текущая дата. Я хочу проверить, является ли данная дата текущей или нет. Как это возможно.Как сравнить две даты в Objective-C

+0

Рассматривая ответы, неясно, хотите ли вы буквально сравнить два экземпляра NSDate для равенства (одинаковый момент времени) или хотите знать, находятся ли они в один и тот же день календаря. –

ответ

2

Вам действительно нужно сравнить два объекта одного и того же типа.

  1. Создание NSDate из вашей даты строки (@ "2009-05-11"):
    http://blog.evandavey.com/2008/12/how-to-convert-a-string-to-nsdate.html

  2. Если текущая дата является строкой тоже делают это NSDate. Если это уже NSDate, оставьте его.

+3

Вы не можете сравнить два объекта, используя == – oxigen

+0

свою ошибку, ответили на другой вопрос одновременно. Спасибо, что комментировали это. –

-2

..

NSString *date = @"2009-05-11" 
NSString *nowDate = [[[NSDate date]description]substringToIndex: 10]; 
if([date isEqualToString: nowDate]) 
{ 
// your code 
} 
+2

Я думаю, было бы гораздо полезнее превратить «дату» в объект NSDate, а затем сравнить объекты NSDate. Этот код будет работать, но substringToIndex: 10 действительно взломан. Если вам нужна дополнительная информация, например, какая дата более поздняя, ​​вам тоже нужно будет это сделать. –

+0

Конечно, вы можете сравнить объекты NSDate. Но NSDate имеет информацию о дате и времени . Ваша потребность 1. Создайте NSDate из строки 2. Перейдите на текущую информацию о времени (установленное время до 00:00:00) И только после этого сравните даты. Я думаю, что этот способ нелегкий и быстрый. – oxigen

+0

Если вас интересует только день, вы можете создать NSDates, а затем использовать NSCalendar, чтобы вывести NSDateComponents из него, после чего вы можете количественно сравнить только те значения, которые вам интересны. Вы также можете получить компоненты для номера дней с эпохи, использовать в одном сравнении. –

3
15

Если вы обе даты NSDate s вы можете использовать NSDate «s compare: метод:

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"); 

Вы можете взглянуть в документах here.

151

Cocoa has couple of methods for this:

в NSDate

– isEqualToDate: 
– earlierDate: 
– laterDate: 
– compare: 

При использовании - (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. 

пример:

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]; 
+1

Как это ответить на исходный вопрос о том, является ли данная дата текущей или нет? [Дата NSDate] будет NSOderedSame на любую фиксированную дату не в течение 24 часов, но менее чем за секунду. – Chei

+0

Это не работает для iOS. См. Принятый ответ: http://stackoverflow.com/questions/14702626/no-visible-interface-for-nsdate-declares-the-selector-initwithstring –

+0

@HappyFlow вопрос помечен 'cocoa', он не упоминает iOS, для получения дополнительной информации попробуйте google «cocoa» против «cocoa touch» – stefanB

42

Здесь дружище. Эта функция будет соответствовать вашей дате с любой указанной датой и будет сообщать о погоде, которую они соответствуют или нет. Вы также можете изменить компоненты в соответствии с вашими требованиями.

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

С уважением, Навид Butt

+3

Это правильный ответ. Хотя главный ответ может быть более общим, это обеспечивает решение, специфичное для представленной проблемы. – elsurudo

+2

JUST PERFECT !! БЫЛО ПЫТАЛОСЬ НЕСКОЛЬКО МЕТОДОВ ЭТО ИГРАТЬ HANDY – raghul

+2

Отличный ответ. Спасибо – moujib

36
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"); 

Есть и другие способы, которые вы можете использовать, чтобы сравнить объекты NSDate. Каждый из методов будет более эффективным при выполнении определенных задач. Я выбрал метод сравнения , потому что он будет обрабатывать большинство ваших основных потребностей сравнения даты.

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

} 

Наслаждайтесь кодированием ......

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

Согласно листингу 13 из Calendrical Calculations в компании Apple Date and Time Programming Guide [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; 
    } 
} 
28

This категория предлагает аккуратный способ сравнения 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 

И реализации:

#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 

Простой в использовании:

if([aDateYouWantToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now 
{ 
    // do your thing ... 
} 
+1

спасибо! Это намного лучше, чем код с NSComparisonResults - непонятным для дат - прямо в нем. –

+0

довольно круто !!! – BlaShadow

+0

Apple должна рассмотреть возможность реализации этого. Намного легче, чем создавать операторы switch для более ранних или равных и более поздних или равных. – geekinit

15

По этому методу также вы можете compa повторно двумя датами

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

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

} 
+2

Интересными константами для сравнения могут быть: 'NSOrderedAscending',' NSOrderedSame' и 'NSOrderedDescending', но OP, вероятно, хочет' NSOrderedSame' для своей конкретной проблемы. – Kris

1

Вот вариант Swift на ответ Паскаля:

extension NSDate { 

    func isLaterThanOrEqualTo(date:NSDate) -> Bool { 
     return !(self.compare(date) == NSComparisonResult.OrderedAscending) 
    } 

    func isEarlierThanOrEqualTo(date:NSDate) -> Bool { 
     return !(self.compare(date) == NSComparisonResult.OrderedDescending) 
    } 

    func isLaterThan(date:NSDate) -> Bool { 
     return (self.compare(date) == NSComparisonResult.OrderedDescending) 
    } 

    func isEarlierThan(date:NSDate) -> Bool { 
     return (self.compare(date) == NSComparisonResult.OrderedAscending) 
    } 
} 

который может быть использован как:

self.expireDate.isEarlierThanOrEqualTo(NSDate()) 
1

Вот функция от ответа Naveed Rafi «s преобразуется в Swift, если кто-либо еще ищет:

func isSameDate(#date1: NSDate, date2: NSDate) -> Bool { 
    let calendar = NSCalendar() 
    let date1comp = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date1) 
    let date2comp = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date2) 
    return (date1comp.year == date2comp.year) && (date1comp.month == date2comp.month) && (date1comp.day == date2comp.day) 
} 
0
Get Today's Date: 

NSDate* date = [NSDate date]; 

Create a Date From Scratch:  
NSDateComponents* comps = [[NSDateComponents alloc]init]; 
comps.year = 2015; 
comps.month = 12; 
comps.day = 31; 
NSCalendar* calendar = [NSCalendar currentCalendar]; 
NSDate* date = [calendar dateFromComponents:comps]; 


Add a day to a Date: 
NSDate* date = [NSDate date]; 
NSDateComponents* comps = [[NSDateComponents alloc]init]; 
comps.day = 1; 
NSCalendar* calendar = [NSCalendar currentCalendar]; 
NSDate* tomorrow = [calendar dateByAddingComponents:comps toDate:date options:nil]; 


Subtract a day from a Date:  
NSDate* date = [NSDate date]; 
NSDateComponents* comps = [[NSDateComponents alloc]init]; 
comps.day = -1; 
NSCalendar* calendar = [NSCalendar currentCalendar]; 
NSDate* yesterday = [calendar dateByAddingComponents:comps toDate:date options:nil]; 



Convert a Date to a String: 

NSDate* date = [NSDate date]; 
NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; 
formatter.dateFormat = @"MMMM dd, yyyy"; 
NSString* dateString = [formatter stringFromDate:date]; 


Convert a String to a Date: 

NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; 
formatter.dateFormat = @"MMMM dd, yyyy"; 
NSDate* date = [formatter dateFromString:@"August 02, 2014"]; 


Find how many days are in a month:  
NSDate* date = [NSDate date]; 
NSCalendar* cal = [NSCalendar currentCalendar]; 
NSRange currentRange = [cal rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date]; 
NSInteger numberOfDays = currentRange.length; 


Calculate how much time something took: 

NSDate* start = [NSDate date]; 
for(int i = 0; i < 1000000000; i++); 
NSDate* end = [NSDate date]; 
NSTimeInterval duration = [end timeIntervalSinceDate:start]; 


Find the Day Of Week for a specific Date: 

NSDate* date = [NSDate date]; 
NSCalendar* cal = [NSCalendar currentCalendar]; 
NSInteger dow = [cal ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date]; 

Затем используйте NSComparisonResult для сравнения даты.