iOS: confronta due date


96

Ho una NSDateche devo confrontare con altre due NSDatee ci provo NSOrderAscendinge NSOrderDescendingma se la mia data è uguale ad altre due date?

Esempio: se ho un myDate = 24/05/2011 e altri due che sono uno = 24/05/2011e due 24/05/2011cosa posso usare?


1
Non capisco completamente la tua domanda, cosa stai cercando di ottenere?
arclight

data uno e data due possono essere uno = 15/05/2011 e due = 31/05/2011 ma devono essere anche lo stesso giorno uno = 24/05/2011 e due = 24/05/2011 quindi devo controllare se myData è compreso tra la data uno e la data due
cyclingIsBetter

Basta estrarre l'anno, il mese e la data e confrontarli in quest'ordine. Se c'è un pareggio, confronta il campo successivo.
Himadri Choudhury

Risposte:


210

Secondo la documentazione Apple diNSDate compare:

Restituisce un valore NSComparisonResult che indica l'ordine temporale del destinatario e un'altra data specifica.

- (NSComparisonResult)compare:(NSDate *)anotherDate

Parametri anotherDate

La data con cui confrontare il ricevitore. Questo valore non deve essere nullo. Se il valore è nullo, il comportamento non è definito e potrebbe cambiare nelle versioni future di Mac OS X.

Valore di ritorno

Se:

Il destinatario e anotherDate sono esattamente uguali tra loro, NSOrderedSame

Il destinatario è più tardi nel tempo rispetto a un'altra data, NSOrderedDescending

Il destinatario è in anticipo rispetto a un altroData, NSOrderedAscending

In altre parole:

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

Nota che potrebbe essere più facile nel tuo caso particolare leggere e scrivere questo:

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

Vedi la documentazione di Apple su questo .


ma f ([date1 compare: date2] == NSOrderedSame) controlla anche l'ora, i minuti e i secondi e non lo voglio
cyclingIsBetter

1
la tua domanda era un po 'poco chiara scusa, dai un'occhiata a stackoverflow.com/questions/1889164/3092009#3092009 , troverai la risposta a questo.
Vincent Guerci

Questa risposta è corretta in entrambi i modi. Per controllare i componenti della data che stai confrontando usaNSDateComponents
Nazir

32

Dopo aver cercato molto su StackOverflow e sul Web, sono arrivato alla conclusione che il modo migliore per farlo è questo:

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

Puoi anche cambiarlo in base alla differenza tra le ore.

Godere!


Modifica 1

Se desideri confrontare la data solo con il formato gg / MM / aaaa, devi aggiungere le seguenti righe tra 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
Grazie, funziona meglio del confronto o
èEqualToDate

Concordato. Ho riscontrato problemi nell'utilizzo di compare & isEqualToDate. Certo, potrebbero essere altre 2 righe di codice, ma è più affidabile.
Coach Roebuck

23

Immagino che tu stia chiedendo qual è il valore di ritorno nella funzione di confronto.

Se le date sono uguali, il ritorno NSOrderedSame

Se crescente (2 ° argomento> 1 ° argomento) ritorna NSOrderedAscending

Se decrescente (2 ° argomento <1 ° argomento) restituisce NSOrderedDescending


Buon modo di pensare di salire e scendere.
David

16

Non so esattamente se l'hai chiesto, ma se vuoi confrontare solo il componente della data di un NSDate devi usare NSCalendar e NSDateComponents per rimuovere il componente dell'ora.

Qualcosa di simile dovrebbe funzionare come categoria per 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

NSDatein realtà rappresenta un intervallo di tempo in secondi da una data di riferimento (1 ° gennaio 2000 UTC credo). Internamente, viene utilizzato un numero in virgola mobile a doppia precisione, quindi è altamente improbabile che due date arbitrarie siano uguali anche se sono nello stesso giorno. Se vuoi vedere se una data particolare cade in un giorno particolare, probabilmente devi usare NSDateComponents. per esempio

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

Controlla la seguente funzione per il confronto della data prima di tutto crea due oggetti NSDate e passa alla funzione: Aggiungi le seguenti righe di codice in viewDidload o in base al tuo scenario.

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

ecco la funzione

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

Cambia semplicemente la data e prova la funzione sopra :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.