iOS: порівняйте дві дати


96

У мене є , NSDateщо я повинен порівняти з двома іншими , NSDateі я намагаюся з NSOrderAscendingі , NSOrderDescendingале якщо моя дата рівно в двох інших дат?

Приклад: якщо я маю a myDate = 24/05/2011 та інші два, які є = = 24/05/2011і два, 24/05/2011що я можу використовувати?


1
Я не повністю розумію ваше запитання, чого ви намагаєтесь досягти?
Arclight

перша дата і друга дата можуть бути одна = 15/05/2011 і дві = 31/05/2011, але вони також повинні бути того самого дня = 24/05/2011 і дві = 24/05/2011, тоді я повинен перевірити, чи myData знаходиться між датою першою та другою датою
cyclingIsBetter

Просто витягніть рік, місяць та дату та порівняйте їх у такому порядку. Якщо є нічия, порівняйте наступне поле.
Хімадрі Чудхурі

Відповіді:


210

Відповідно до документації Apple відNSDate compare:

Повертає значення NSComppareResult, яке вказує на тимчасове впорядкування приймача та іншу дату.

- (NSComparisonResult)compare:(NSDate *)anotherDate

Параметри anotherDate

Дата порівняння приймача. Це значення не повинно бути рівним нулю. Якщо значення дорівнює нулю, поведінка не визначена і може змінитися в майбутніх версіях Mac OS X.

Повернене значення

Якщо:

Приймач і anotherDate точно рівні між собою, NSOrderedSame

Приймач пізніше за часом, ніж інша дата, NSOrderedDescending

Приймач раніше за часом, ніж інша дата, NSOrderedAscending

Іншими словами:

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

Зверніть увагу, що у вашому конкретному випадку може бути простіше прочитати та написати:

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

Дивіться Документацію Apple про цю .


але f ([date1 порівняти: date2] == NSOrderedSame) перевірити також хвилину години та секунди, і я цього не хочу
cyclingIsBetter

1
Ваше запитання було трохи незрозумілим, вибачте, подивіться на stackoverflow.com/questions/1889164/3092009#3092009 , ви знайдете відповідь на це.
Вінсент Герці,

Ця відповідь вірна обома способами. Для контролю компонентів дати, які ви порівнюєте, використовуйтеNSDateComponents
Назір

32

Шукаючи stackoverflow та багато в Інтернеті, я переконався, що найкращий спосіб зробити це такий:

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

Ви також можете змінити його на різницю між годинами.

Насолоджуйтесь!


Редагуйте 1

Якщо ви хочете порівняти дату лише з форматом dd / MM / yyyy, вам потрібно додати нижче рядків між 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
Завдяки цьому працює краще, ніж порівняти або isEqualToDate
ArdenDev

Домовились. Я виявив проблеми із порівнянням & isEqualToDate. Звичайно, це можуть бути додаткові 2 рядки коду, але він більш надійний.
Тренер Робак

23

Я вважаю, ви запитуєте, яке значення повертається у функції порівняння.

Якщо дати рівні, то повертаються NSOrderedSame

Якщо висхідний (2-й аргумент> 1-й аргумент) повернеться NSOrderedAscending

Якщо спадає (2-й аргумент <1-й аргумент), поверніться NSOrderedDescending


Хороший спосіб думати про сходження і спуск.
Девід

16

Я точно не знаю, чи запитували ви це, але якщо ви хочете лише порівняти компонент дати NSDate, вам потрібно скористатися NSCalendar та NSDateComponents для видалення часового компонента.

Щось подібне має працювати як категорія для 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

NSDateнасправді представляє інтервал часу в секундах з контрольної дати (1 січня 2000 UTC, я думаю). Внутрішньо використовується номер з плаваючою комою з подвійною точністю, тому дві довільні дати навряд чи можна порівняти рівними, навіть якщо вони є в один і той же день. Якщо ви хочете побачити, чи припадає певна дата на певний день, вам, мабуть, потрібно скористатися NSDateComponents. напр

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

Перевірте наступну функцію для порівняння дат, насамперед створіть два об’єкти NSDate та перейдіть до функції: Додайте рядки коду в viewDidload або відповідно до вашого сценарію.

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

ось функція

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

Просто змініть дату та перевірте функцію вище :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.