iOS: сравните две даты
У меня есть NSDate
что я должен сравнить с двумя другими NSDate
и я пытаюсь с NSOrderAscending
а также NSOrderDescending
но если моя дата равна другим двум датам?
Пример: если у меня есть myDate = 24/05/2011
и два других, которые являются одним = 24/05/2011
и два 24/05/2011
что я могу использовать?
6 ответов
Согласно документации Apple, NSDate compare:
Возвращает значение NSComparisonResult, которое указывает временное упорядочение получателя и другую заданную дату.
- (NSComparisonResult)compare:(NSDate *)anotherDate
параметры
anotherDate
Дата, с которой нужно сравнить получателя. Это значение не должно быть равно нулю. Если значение равно nil, поведение не определено и может измениться в будущих версиях Mac OS X.
Возвращаемое значение
Если:
Получатель и anotherDate точно равны друг другу,
NSOrderedSame
Получатель позже по времени, чем другая дата,
NSOrderedDescending
Получатель раньше времени, чем другая дата,
NSOrderedAscending
Другими словами:
if ([date1 compare:date2] == NSOrderedSame) ...
Обратите внимание, что в вашем конкретном случае может быть проще прочитать и написать это:
if ([date2 isEqualToDate:date2]) ...
После тщательного поиска в stackru и в Интернете, я пришел к выводу, что лучший способ сделать это так:
- (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
Если вы хотите сравнить дату только с форматом дд / мм / гггг, вам нужно добавить строки ниже 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];
Я так понимаю, вы спрашиваете, какое возвращаемое значение есть в функции сравнения.
Если даты равны, то возвращение NSOrderedSame
В случае возрастания ( 2-й аргумент> 1-й аргумент) возврат NSOrderedAscending
Если по убыванию ( 2-й аргумент < 1-й аргумент), возврат NSOrderedDescending
Я не знаю точно, спрашивали ли вы об этом, но если вы хотите сравнить только компонент даты 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];
}
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
}
Проверьте следующую функцию для сравнения дат, прежде всего создайте два объекта 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;}
Просто измените дату и протестируйте вышеуказанную функцию:)