Как я могу сравнить «сегодня» (NSDate) с форматированной строковой датой (дд / мм / гггг)? - PullRequest
3 голосов
/ 25 февраля 2011

Я новичок в программировании на iOS и много искал способ сравнить «сегодня» (NSDate) с форматированной строковой датой (дд / мм / гггг).

Я нашел несколько хороших ответов с NSDate earlierDate, laterDate и т. Д., Но, похоже, код не работает в моем проекте.

вот оно:

// [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");
}

Что бы я ни делал и независимо от даты в [book quandd], консоль всегда пишет «раньше» и «позже», как если бы они были позже и раньше одновременно, чем сегодня .

Откуда взялась эта "ошибка"?

Есть ли какой-нибудь простой / легкий способ сравнить сегодняшнюю дату с 26/02/2011 , например?

Ответы [ 5 ]

1 голос
/ 21 августа 2014

NSDate включает в себя как дату, так и время. Никакие два значения NSDate не будут равны, если время не будет равно миллисекунде (если не меньше). Когда вы делаете [NSDate date], вы получаете точное время «сейчас», а если вы используете NSDateFormatter для преобразования строки в дату (без значения времени), тогда используется полночь.

Если вы хотите увидеть, попадают ли две даты NSD в один и тот же день, вы можете использовать NSCalendar & NSDateComponents. Или вы можете «обмануть» и отформатировать обе даты в строку даты без значения времени и сравнить строки.

- (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;
    }
}
0 голосов
/ 21 августа 2014

Ваша «ошибка» происходит потому, что позжеDate и earlyDate возвращают объект даты, который раньше или позже.Возвращаемый объект всегда не ноль, поэтому оба оператора if оцениваются как true.Правильный способ их использования таков:

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

В качестве альтернативы я использовал timeIntervalSinceDate, который возвращает секунды между первой и второй датой.

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");
}
0 голосов
/ 25 февраля 2011

используйте это

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");
    }
0 голосов
/ 25 февраля 2011

Вам необходимо проверить возвращаемое значение ранее даты с одной из упомянутых дат. Пример: если ([дата1 ранее дата: дата2] == дата1)

0 голосов
/ 25 февраля 2011

Используйте timeIntervalSinceNow:, чтобы получить разность с необходимой даты.

Вам также следует попытаться выяснить разницу между ними, а затем преобразовать в строку.

...