3 Stimmen

Wie kann ich "heute" (NSDate) mit einer formatierten Datumsfolge (tt/MM/jjjj) vergleichen?

Ich bin neu in iOS-Programmierung und ich habe eine Menge für einen Weg zu vergleichen "heute" (ein NSDate) zu einem formatierten String Datum (dd/MM/yyyy) gesucht.

Ich habe einige gute Antworten mit den NSDate's gefunden earlierDate , laterDate usw., aber der Code scheint in meinem Projekt nicht zu funktionieren.

Hier ist sie:

// [book quandd]  is the string :    25/02/2011  (or whatever dd/MM/yyyy date)

NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd/MM/yyyy"];

if ( [[dateFormat dateFromString:[book quandd]] isEqualToDate:today]) {
    NSLog(@"Dates are equal");
}
if ( [[dateFormat dateFromString:[book quandd]] earlierDate:today]) {
    NSLog(@"earlier");
}
if ( [[dateFormat dateFromString:[book quandd]] laterDate:today]) {
    NSLog(@"later");
}

Was auch immer ich tue und wann auch immer das Datum in [book quandd] schreibt die Konsole immer "früher" und "später", als ob sie gleichzeitig später und früher wären als heute .

Woher kommt dieser "Fehler"?

Gibt es eine einfache/einfachere Möglichkeit, die heute Verabredung mit 26/02/2011 zum Beispiel ?

1voto

Hot Licks Punkte 46043

Ein NSDate enthält sowohl Datum als auch Uhrzeit. Keine zwei NSDate-Werte sind gleich, es sei denn, die Zeiten sind bis auf die Millisekunde genau identisch (wenn nicht sogar noch feiner). Wenn Sie [NSDate date] erhalten Sie die genaue Uhrzeit von "now", während bei Verwendung von NSDateFormatter zur Konvertierung einer Zeichenkette in ein Datum (ohne Zeitangabe) Mitternacht verwendet wird.

Wenn Sie sehen möchten, ob zwei NSDates auf denselben Tag fallen, können Sie NSCalendar & NSDateComponents verwenden. Oder Sie können "schummeln" und beide Daten als Datumsstring ohne Zeitwert formatieren und die Strings vergleichen.

- (void) CompareDate:(NSDate*)date1 toDate:(NSDate*)date2 {
    NSDateFormatter* fmt = [NSDateFormatter new];
    [fmt setDateFormat:@"yyyyMMdd"];
    // Note that you should set the appropriate timezone if you don't want the default.
    NSString* date1Str = [fmt stringFromDate:date1];
    NSString* date2Str = [fmt stringFromDate:date2];
    switch ([date1Str compare:date2Str]) {
        case NSOrderedAscending:
            NSLog(@"Date 1 is earlier");
            break;
        case NSOrderedSame:
            NSLog(@"Dates are equal");
            break;
        case NSOrderedDescending:
            NSLog(@"Date 2 is earlier");
            break;
    }
}

0voto

visakh7 Punkte 26330

Verwenden Sie timeIntervalSinceNow: um die Differenz zum erforderlichen Datum zu erhalten.

Sie sollten auch versuchen, die Differenz zwischen ihnen zu ermitteln und dann in eine Zeichenkette umzuwandeln.

0voto

Ishu Punkte 12816

Dies verwenden

NSDate *today = [NSDate date];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"dd/MM/yyyy"];

    if ( [[dateFormat dateFromString:[book quandd]] compare:today]==NSOrderedSame) {
        NSLog(@"Dates are equal");
    }
    if ( [[dateFormat dateFromString:[book quandd]] compare:today]==NSOrderedAscending) {
        NSLog(@"earlier");
    }
    if ( [[dateFormat dateFromString:[book quandd]] laterDate:today]==NSOrderedDescending) {
        NSLog(@"later");
    }

0voto

Vijay Shankar Punkte 180

Sie müssen den Rückgabewert von earlierDate mit einem der angegebenen Daten vergleichen. Beispiel: if([date1 earlierDate:date2] == date1)

0voto

mitrenegade Punkte 1794

Ihr "Fehler" tritt auf, weil laterDate und earlierDate das Datumsobjekt zurückgeben, das entweder früher oder später ist. Das Rückgabeobjekt ist immer nonnil, so dass beide if-Anweisungen zu true ausgewertet werden. Der korrekte Weg, um sie zu verwenden, ist dieser Weg:

NSString *book = @"19/08/2014";

NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd/MM/yyyy"];

NSDate *date = [dateFormat dateFromString:book];
if ( [date timeIntervalSinceDate:today] == 0) {
    NSLog(@"Dates are equal");
}
if ( [date laterDate:today] == today ) {
    NSLog(@"earlier");
}
if ( [date laterDate:today] == date) {
    NSLog(@"later");
}

Alternativ habe ich timeIntervalSinceDate verwendet, das die Sekunden zwischen dem ersten Datum und dem zweiten Datum zurückgibt.

NSString *book = @"19/08/2014";

NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd/MM/yyyy"];

NSDate *date = [dateFormat dateFromString:book];
if ( [date timeIntervalSinceDate:today] == 0) {
    NSLog(@"Dates are equal");
}
if ( [date timeIntervalSinceDate:today] < 0 ) {
    NSLog(@"earlier");
}
if ( [date timeIntervalSinceDate:today] > 0) {
    NSLog(@"later");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X