2011-11-18 23 views
28

Mam obiektów typu Data ..Jak porównać dwa obiekty NSDate w celu C

więc chcę je porównać, a ja napisałem jeśli warunek w poniższej poniżej sposób

if(([startDate1 isEqualToDate:[self getDefaultDate]]) || (startDate1 != [ self getDefaultDate] && m_selectedDate >= m_currentDate1 && cycleStopped)) 
{ 

///execute some condition 

} 

Więc czy mam rację, czy nie. Czy w tym podejściu?

jeszcze jedno czy prostowania w ten sposób ma rację

if(dtdate > [m_array objectatIndex:i] 
{ 

} 

Ponieważ jestem coraz losowe zachowanie ..

Więc proszę mi pomóc przyjaciele i maniaków

Pozdrowienia Ranjit

+0

Jest to metoda zwana porównania: w klasie odniesienia NSDate, że należy pomóc. http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html – Luke

+0

Hej, skarbie, jak mogę sprawdzić i "zauważyć" warunek – Ranjit

+0

@Ranjit można użyć logiczny operator nie z takim samym wywołaniem metody: '! [d1 isEqualToDate: d2] ' – zekel

Odpowiedz

64

Oto przykład użycia metody NSDate, compare:

if([startDate compare: endDate] == NSOrderedDescending) // if start is later in time than end 
{ 
    // do something 
} 

Z odniesieniem klasy:

Jeśli ...

Odbiornik i anotherDate są dokładnie równe względem siebie, NSOrderedSame.

Odbiorca jest późniejszy niż innyData, NSOrderedDescending.

Odbiornik jest wcześniejszy niż innyData, NSOrderedAscending.

Można również użyć metody timeIntervalSinceDate:, jeśli chcesz porównać dwie daty i znaleźć na przykład sekundy między nimi.

EDIT:

if(([startDate1 compare:[self getDefaultDate]] == NSOrderedSame) || ([startDate1 compare: [self getDefaultDate]] != NSOrderedSame && (([m_selectedDate compare: m_currentDate1] == NSOrderedDescending) || [m_selectedDate compare: m_currentDate1] == NSOrderedSame) && cycleStopped)) 
+0

Hej, skarbie, dziękuję za twoje informacje, ale jestem zdezorientowany ... możesz pokazać, konwertując mój powyższy stan na swój sposób ... tak, że będzie bardzo pomocny .. dzięki hej i jeszcze jeden. .Opóźnienie oznacza, że ​​większe lub nowsze oznacza, że ​​zaktualizowano aktualizację – Ranjit

+0

. po prostu dwukrotnie sprawdź nawiasy itp.! – Luke

+0

@Ranjit NSDates działają według ilości czasu, więc większe liczby to późniejsze daty. Wszystko w klasie: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html – Aberrant

16

łatwy sposób porównać NSDates (znaleziono tu http://webd.fr/637-comparer-deux-nsdate):

#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 

i wdrożenie:

#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 

Prosty w użyciu:

if([aDateYouWant ToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now 
{ 
    // do your thing ... 
} 

Ciesz się

+0

Witam @Pascal możemy rozmawiać, mam kilka wątpliwości – Ranjit

+0

Witam @Ranjit. Po prostu daj mi e-mail. – Pascal

+0

Na początku to napisałem, ponieważ dodanie kategorii wydaje się kłopotliwe, ale po przejrzeniu alternatyw ... Ten dostaje mój głos. – davew

1

Jest to prosty sposób sprawdzenia, czy data jest większa (np. w przyszłości) w porównaniu z datą, o której myślisz, że jest wcześniej. Oto, co to robi.

  1. Pobiera przedział czasu (kilka sekund i frac sekundach) zarówno obecnych jak i przyszłych daty
  2. Zwraca true jeżeli data Twój badania jest większa (referencyjna), jednak druga data

Tutaj iść

- (BOOL)isDateGreaterThanDate:(NSDate*)greaterDate and:(NSDate*)lesserDate{ 

    NSTimeInterval greaterDateInterval = [greaterDate timeIntervalSince1970]; 
    NSTimeInterval lesserDateInterval = [lesserDate timeIntervalSince1970]; 

    if (greaterDateInterval > lesserDateInterval) 
     return YES; 

    return NO; 
} 

działa to również

BOOL *isGreaterDateTruelyGreater = [greaterDate timeIntervalSince1970] > [lesserDate timeIntervalSince1970]; 

Sposób, w jaki cel c zajmuje się datami, jest mniejszy niż intuicyjny. Zasadniczo można użyć NSTimeInterval, aby uzyskać liczbę sekund od punktu w czasie. Zwykle daje długi numer, na przykład jak piszę ten 1351026414.640865 jest przedział czasowy od 1970.

punkt w czasie> punkt w czasie 1351026415.640865> 1351026414.640865 Powyższy wynosi 1 sekundę do przodu, tak, to prawda.

2

Bardzo mi się spodobała odpowiedź Luke'a i zadziałało jak urok.

Kiedyś coś takiego:

If ([enteredDate compare: [NSDate Date]]== NSOrderedSame || NSOrderedDescending) 
{ 
//Do Something if the enteredDate is later or the same as today 
}else 
{ 
//if the enteredDate is before today's date 
} 

Nie jestem pewien, czy to pomaga, ale tylko powtórzyć to, co Łukasz napisał.

3

Muszę przyznać, że znajduję "porównywać" == NSWhatHaveYou biznes zbyt skomplikowany do zapamiętania (nawet jeśli jest poprawny i działa). NSDate ma dwie inne metody, z którymi mój mózg znacznie łatwiej sobie radzi: earlyDate i laterDate.

Rozważ to:

if ([myDate laterDate:today] == myDate) { 
    NSLog(@"myDate is LATER than today"); 
} else { 
    NSLog(@"myDate is EARLIER than today"); 
} 

// likewise: 
if ([myDate earlierDate:today] == myDate) { 
    NSLog(@"myDate is EARLIER than today"); 
} else { 
    NSLog(@"myDate is LATER than today"); 
} 

Albo metoda zwraca obiekt NSDate, który jest albo wcześniej lub później niż drugiego.

http://pinkstone.co.uk/how-to-compare-two-nsdates/

+0

Dzięki za informację ... jest naprawdę łatwa do zapamiętania – Ranjit