Сравнение двух NSDates и игнорирование компонента времени - PullRequest
71 голосов
/ 06 декабря 2009

Какой самый эффективный / рекомендуемый способ сравнения двух NSDates? Я хотел бы иметь возможность видеть, если обе даты находятся в один и тот же день, независимо от времени и начали писать некоторый код, который использует timeIntervalSinceDate: метод в классе NSDate и получает целое число этого значения, деленное на количество секунд в день. Это кажется многословным, и я чувствую, что упускаю что-то очевидное.

Код, который я пытаюсь исправить:

if (!([key compare:todaysDate] == NSOrderedDescending))
{
    todaysDateSection = [eventSectionsArray count] - 1;
}

где key и todaysDate являются объектами NSDate, а todaysDate создается с использованием:

NSDate *todaysDate = [[NSDate alloc] init];

Привет

Дейв

Ответы [ 16 ]

2 голосов
/ 31 марта 2017

Для разработчиков, пишущих в Swift 3

if(NSCalendar.current.isDate(selectedDate, inSameDayAs: NSDate() as Date)){
     // Do something
}
1 голос
/ 10 февраля 2016

Моим решением было два преобразования с NSDateFormatter:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyyMMdd"];
    [dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

    NSDate *today = [NSDate dateWithTimeIntervalSinceNow:0];
    NSString *todayString=[dateFormat stringFromDate:today];
    NSDate *todayWithoutHour=[dateFormat dateFromString:todayString];

    if ([today compare:exprDate] == NSOrderedDescending)
    {
       //do  
    }
1 голос
/ 18 сентября 2014
int interval = (int)[firstTime timeIntervalSinceDate:secondTime]/(60*60*24);
if (interval!=0){
   //not the same day;
}
0 голосов
/ 27 февраля 2015
NSUInteger unit = NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit;
NSDateComponents *comp = [cal components:unit
                                fromDate:nowDate
                                  toDate:setDate
                                 options:0];

NSString *dMonth;
dMonth = [NSString stringWithFormat:@"%02ld",comp.month];
NSString *dDay;
dDay = [NSString stringWithFormat:@"%02ld",comp.day + (comp.hour > 0 ? 1 : 0)];

сравните час, чтобы исправить разницу в 1 день

0 голосов
/ 30 июня 2013

Это особенно безобразная кошка на коже, но вот еще один способ сделать это. Я не говорю, что это элегантно, но, вероятно, это настолько близко, насколько это возможно с поддержкой даты / времени в iOS.

bool isToday = [[NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterFullStyle timeStyle:NSDateFormatterNoStyle] isEqualToString:[NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterFullStyle timeStyle:NSDateFormatterNoStyle]];
0 голосов
/ 06 декабря 2009

Документация, касающаяся NSDate , указывает, что методы compare: и isEqual: будут выполнять базовое сравнение и упорядочивать результаты, хотя они все еще учитывают время.

Вероятно, самым простым способом управления задачей было бы создание нового isToday метода с эффектом следующего:

- (bool)isToday:(NSDate *)otherDate
{
    currentTime = [however current time is retrieved]; // Pardon the bit of pseudo-code

    if (currentTime < [otherDate timeIntervalSinceNow])
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
...